天天看點

Python3中redis子產品學習之sorted set資料類型操作起步增删改查整體代碼

目錄

  • 起步
    • zadd
    • zrem
    • zremrangebyrank
    • zremrangebyscore
    • zincrby
    • zrank
    • zrevrank
    • zscore
    • zcount
    • zrange
    • zrevrange
    • zrangebyscore
    • zrevrangebyscore
    • zcard
    • zscan_iter
  • 整體代碼

起步

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""sorted set類型操作

有序集合,成員唯一,分數(浮點型)可以重複
"""

import redis

pool = redis.ConnectionPool(host='192.168.1.104', password='hardy9sap', decode_responses=True)

rs = redis.Redis(connection_pool=pool)

is_connected = rs.ping()
           

zadd

zadd(name, mapping, nx=False, xx=False, ch=False, incr=False)
往name添加一個或多個帶分數的成員,傳回添加的成員個數;
預設情況下,如果是更新分數的話,傳回0,因為不是添加

  nx:member必須不存在,才可以設定成功,用于添加.

  xx:member必須存在,才可以設定成功,用于添加.

  ch:傳回此次操作後,有序結合元素和分數發生變化的個數.(預設不會對更新分數進行統計)

  incr: 對score進行添加操作,相當于後面介紹的zincrby. (在原有分數上增加)
           

示例

rsp = rs.zadd(name='redis:method:zadd', mapping={
    'value1': '12',
    'value2': '20.5',
    'value3': 30
})  # 3

print(rsp)
           

zrem

zrem(name, *args),從name中删除一個或多個成員,傳回成功删除的個數
           

示例

rsp = rs.zrem('redis:method:zadd', *('value1', 'value2', 'no:exists:value'))

print(rsp)  # 2
           

zremrangebyrank

zremrangebyrank(name, min, max),
根據rank删除在min和max指定的範圍内的成員,傳回成功删除的個數
           

示例

rsp = rs.zremrangebyrank(name='redis:method:zadd', min=0, max=5)

print(rsp)  # 1
           

zremrangebyscore

zremrangebyscore(name, min, max),
根據score删除在min和max指定的範圍内的成員,傳回成功删除的個數
           

示例

rsp = rs.zremrangebyscore(name='redis:method:zadd', min=10, max=20)

print(rsp)  # 0
           

zincrby

zincrby(name, amount, value)
在原有值基礎上增加amount,傳回增加之後的值
1. amount可以為整型和浮點型
2. amount可以為負數
           

示例

rsp = rs.zincrby(name='zset', amount=10.6, value='value1')

print(rsp)  # 10.0
           

zrank

zrank(name, value),
傳回 value 在 name 中排名,按照分數從低到高排序,第一名為0,第二名為1,以此類推。
name or value 不存在,傳回None,
相同的話,誰先添加誰排名高
           

示例

rsp = rs.zrank(name='zset', value='value1')

print(rsp)  # 1
           

zrevrank

zrevrank(name, value),
傳回 value 在 name 中排名,按照分數從高到低排序,第一名為0,第二名為1,以此類推。
name or value 不存在,傳回None,
相同的話,誰先添加誰排名高
           

示例

rsp = rs.zrevrank(name='zset', value='value1')

print(rsp)  # 3
           

zscore

zscore(name, value),
傳回 value 在 name 中的分數,浮點類型
name or value 不存在,傳回None,
           

示例

rsp = rs.zscore(name='zset', value='value2')

print(rsp)  # 20.0
           

zcount

zcount(name, min, max),
統計name中成員分數在[min - max]中的個數
name 不存在 Or min、max不符合規則,傳回0
           

示例

rsp = rs.zcount(name='zset', min=10, max=20)

print(rsp)  # 2
           

zrange

zrange(name, start, end, desc=False, withscores=False, score_cast_func=float)
按照start和end指定的範圍擷取name中的成員
desc,表示是否要降序
withscores,表示是否傳回分數
score_cast_func,表示将分數轉換成什麼類型
           

示例

不帶分數

rsp = rs.zrange(name='zset', start=0, end=-1)

print(rsp)  # ['value1', 'value2', 'value3', 'name']
           

帶分數,并且轉換成int類型

rsp = rs.zrange(name='zset', start=0, end=-1, withscores=True, score_cast_func=int)

print(rsp)  # [('value1', 10.0), ('value2', 20.0), ('value3', 30.0), ('name', 40.0)]
           

降序

rsp = rs.zrange(name='zset', start=0, end=-1, desc=True, withscores=True, score_cast_func=int)

print(rsp)  # [('name', 40), ('value3', 30), ('value2', 20), ('value1', 10)]
           

zrevrange

zrevrange(name, start, end, withscores=False, score_cast_fun=float)
在zrange的基礎上,反序輸出
           

示例

rsp = rs.zrevrange(name='zset', start=0, end=-1, withscores=True, score_cast_func=int)

print(rsp)  # [('name', 40), ('value3', 30), ('value2', 20), ('value1', 10)]
           

zrangebyscore

zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)
跟據分數來顯示
start,表示偏移量,從哪個元素開始顯示
num,表示個數,傳回幾個
withscores,表示時候要顯示分數
score_cast_func,表示将分數轉換成什麼類型
           

示例

# 表示0 <= score <= 10
rsp = rs.zrangebyscore(name='zset', min=0, max=10, start=None, num=None, withscores=True, score_cast_func=int)

# 當想擷取全部的資料,但是不知道上限和下限,可以使用-inf、+inf字元串
rsp = rs.zrangebyscore(name='zset', min='-inf', max='+inf', start=None, num=None, withscores=True, score_cast_func=int)

rsp = rs.zrangebyscore(name='zset', min=-float('inf'), max=+float('inf'), start=None, num=None, withscores=True, score_cast_func=int)

# 表示0 < score <= 50
rsp = rs.zrangebyscore(name='zset', min='(0', max='50', start=None, num=None, withscores=True, score_cast_func=int)

print(rsp)  # [('value1', 10), ('value2', 20), ('value3', 30), ('name', 40)]
           

zrevrangebyscore

zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)
在zrangebyscore的基礎上,倒序
start,表示偏移量,從哪個元素開始顯示
num,表示個數,傳回幾個
withscores,表示時候要顯示分數
score_cast_func,表示将分數轉換成什麼類型
           

示例

rsp = rs.zrevrangebyscore(name='zset', max=50, min=10, start=1, num=2, withscores=True, score_cast_func=int)

print(rsp)  # [('value3', 30), ('value2', 20)]
           

zcard

zcard(name),統計name中的成員個數
           

示例

rsp = rs.zcard(name='zset')

print(rsp)  # 4
           

zscan_iter

zscan_iter(name, match=None, count=None, score_cast_func=float):
同字元串相似,相較于字元串新增score_cast_func,用來對分數進行操作
           

示例

for s in rs.zscan_iter(name='zset'):
    print(s)
           

整體代碼

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""sorted set類型操作

有序集合,成員唯一,分數(浮點型)可以重複
"""

import redis

pool = redis.ConnectionPool(host='192.168.1.104', password='hardy9sap', decode_responses=True)

rs = redis.Redis(connection_pool=pool)

is_connected = rs.ping()

# 增
# 1. zadd
# ===============================================================================
# zadd(name, mapping, nx=False, xx=False, ch=False, incr=False)
# 往name添加一個或多個帶分數的成員,傳回添加的成員個數;
# 預設情況下,如果是更新分數的話,傳回0,因為不是添加
#
#   nx:member必須不存在,才可以設定成功,用于添加.
#
#   xx:member必須存在,才可以設定成功,用于添加.
#
#   ch:傳回此次操作後,有序結合元素和分數發生變化的個數.(預設不會對更新分數進行統計)
#
#   incr: 對score進行添加操作,相當于後面介紹的zincrby. (在原有分數上增加)
# ==============================================================================
# if is_connected:
#     rsp = rs.zadd(name='redis:method:zadd', mapping={
#         'value1': '12',
#         'value2': '20.5',
#         'value3': 30
#     })  # 3
#
#     print(rsp)

# 删
# 1. zrem
# =============================================================
# zrem(name, *args),從name中删除一個或多個成員,傳回成功删除的個數
# =============================================================
# if is_connected:
#     rsp = rs.zrem('redis:method:zadd', *('value1', 'value2', 'no:exists:value'))
#     print(rsp)  # 2

# 2. zremrangebyrank
# ======================================================
# zremrangebyrank(name, min, max),
# 根據rank删除在min和max指定的範圍内的成員,傳回成功删除的個數
# ======================================================
# if is_connected:
#     rsp = rs.zremrangebyrank(name='redis:method:zadd', min=0, max=5)
#     print(rsp)  # 1

# 3. zremrangebyscore
# ======================================================
# zremrangebyscore(name, min, max),
# 根據score删除在min和max指定的範圍内的成員,傳回成功删除的個數
# ======================================================
# if is_connected:
#     rsp = rs.zremrangebyscore(name='redis:method:zadd', min=10, max=20)
#     print(rsp)  # 0

# 改
# 1. zincrby
# =====================================
# zincrby(name, amount, value)
# 在原有值基礎上增加amount,傳回增加之後的值
# 1. amount可以為整型和浮點型
# 2. amount可以為負數
# ======================================
# if is_connected:
#     rsp = rs.zincrby(name='zset', amount=10.6, value='value1')
#     print(rsp)  # 10.0

# 查
# 1. zrank
# ==========================================
# zrank(name, value),
# 傳回 value 在 name 中排名,按照分數從低到高排序,第一名為0,第二名為1,以此類推。
# name or value 不存在,傳回None,
# 相同的話,誰先添加誰排名高
# ==========================================
# if is_connected:
#     rsp = rs.zrank(name='zset', value='value1')
#     print(rsp)  # 1

# 2. zrevrank
# ==========================================
# zrevrank(name, value),
# 傳回 value 在 name 中排名,按照分數從高到低排序,第一名為0,第二名為1,以此類推。
# name or value 不存在,傳回None,
# 相同的話,誰先添加誰排名高
# ==========================================
# if is_connected:
#     rsp = rs.zrevrank(name='zset', value='value1')
#     print(rsp)  # 3

# 3. zscore
# ==========================================
# zscore(name, value),
# 傳回 value 在 name 中的分數,浮點類型
# name or value 不存在,傳回None,
# ==========================================
# if is_connected:
#     rsp = rs.zscore(name='zset', value='value2')
#     print(rsp)  # 20.0

# 4. zcount
# ========================================
# zcount(name, min, max),
# 統計name中成員分數在[min - max]中的個數
# name 不存在 Or min、max不符合規則,傳回0
# ========================================
# if is_connected:
#     rsp = rs.zcount(name='zset', min=10, max=20)
#     print(rsp)  # 2

# 5. zrange
# ===========================================================================
# zrange(name, start, end, desc=False, withscores=False, score_cast_func=float)
# 按照start和end指定的範圍擷取name中的成員
# desc,表示是否要降序
# withscores,表示是否傳回分數
# score_cast_func,表示将分數轉換成什麼類型
# ============================================================================
# if is_connected:
#     # 不帶分數
#     rsp = rs.zrange(name='zset', start=0, end=-1)
#     print(rsp)  # ['value1', 'value2', 'value3', 'name']
#
#     # 帶分數,并且轉換成int類型
#     rsp = rs.zrange(name='zset', start=0, end=-1, withscores=True, score_cast_func=int)
#     print(rsp)  # [('value1', 10.0), ('value2', 20.0), ('value3', 30.0), ('name', 40.0)]
#
#     # 降序
#     rsp = rs.zrange(name='zset', start=0, end=-1, desc=True, withscores=True, score_cast_func=int)
#     print(rsp)  # [('name', 40), ('value3', 30), ('value2', 20), ('value1', 10)]

# 6. zrevrange
# ==================================================================
# zrevrange(name, start, end, withscores=False, score_cast_fun=float)
# 在zrange的基礎上,反序輸出
# ==================================================================
# if is_connected:
#     rsp = rs.zrevrange(name='zset', start=0, end=-1, withscores=True, score_cast_func=int)
#     print(rsp)  # [('name', 40), ('value3', 30), ('value2', 20), ('value1', 10)]

# 7. zrangebyscore
# ================================================================
# zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)
# 跟據分數來顯示
# start,表示偏移量,從哪個元素開始顯示
# num,表示個數,傳回幾個
# withscores,表示時候要顯示分數
# score_cast_func,表示将分數轉換成什麼類型
# ================================================================
# if is_connected:
#     rsp = rs.zrangebyscore(name='zset', min=10, max=50, start=None, num=None, withscores=True, score_cast_func=int)
#     print(rsp)  # [('value1', 10), ('value2', 20), ('value3', 30), ('name', 40)]

# 8.zrevrangebyscore
# ================================================================
# zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)
# 在zrangebyscore的基礎上,倒序
# start,表示偏移量,從哪個元素開始顯示
# num,表示個數,傳回幾個
# withscores,表示時候要顯示分數
# score_cast_func,表示
# ================================================================
# if is_connected:
#     rsp = rs.zrevrangebyscore(name='zset', max=50, min=10, start=1, num=2, withscores=True, score_cast_func=int)
#     print(rsp)  # [('value3', 30), ('value2', 20)]

# 9. zcard
# =======================================
# zcard(name),統計name中的成員個數
# =======================================
# if is_connected:
#     rsp = rs.zcard(name='zset')
#     print(rsp)  # 4

# 10. zscan_iter
# =======================
# zscan_iter(name, match=None, count=None, score_cast_func=float):
# 同字元串相似,相較于字元串新增score_cast_func,用來對分數進行操作
# =======================
for s in rs.zscan_iter(name='zset'):
    print(s)

           

繼續閱讀