缓存数据库-redis数据类型和操作(sorted set) 一:Redis 有序集合(sorted set)

  Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

  不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

  有序集合的成员是唯一的,但分数(score)却可以重复。

  集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

二:有序集合常用操作

  1)zadd(name, *args, **kwargs) 在name对应的有序集合中添加元素

  2)zcard(name) 获取name对应的有序集合元素的数量

  3)zcount(name, min, max)  获取name对应的有序集合中分数 在 [min,max] 之间的个数

  4)zincrby(name, value, amount)  自增name对应的有序集合的 name 对应的分数

  5)zrange( name, start, end, desc=False, withscores=False, score_cast_func=float) 按照索引范围获取name对应的有序集合的元素

    # 参数:

    # name,redis的name
    # start,有序集合索引起始位置(非分数)
    # end,有序集合索引结束位置(非分数)
    # desc,排序规则,默认按照分数从小到大排序
    # withscores,是否获取元素的分数,默认只获取元素的值
    # score_cast_func,对分数进行数据转换的函数
  6)zrank(name, value) 获取某个值在 name对应的有序集合中的排行(从 0 开始)
  7)zrem(name, values) 删除name对应的有序集合中值是values的成员
  9)zremrangebyrank(name, min, max)  根据排行范围删除
  10)zremrangebyscore(name, min, max)   根据分数范围删除
  11)zscore(name, value)  获取name对应有序集合中 value 对应的分数
  12)zinterstore(dest, keys, aggregate=None) 获取两个有序集合的交集,如果遇到相同值不同分数,则按照aggregate进行操作
  13)zunionstore(dest, keys, aggregate=None) 获取两个有序集合的并集,如果遇到相同值不同分数,则按照aggregate进行操作
  14)zscan(name, cursor=0, match=None, count=None, score_cast_func=float) 
 

三:示例

[BEGIN] 2017/7/31 21:03:29
127.0.0.1:6379[3]> zadd z1 1 s1   增加一个有序集合
(integer) 1
127.0.0.1:6379[3]> zadd z1 2 s2
(integer) 1
127.0.0.1:6379[3]> zadd z1 2 s3
(integer) 1
127.0.0.1:6379[3]> ZCARD z1   有序集合的元素个数
(integer) 3
127.0.0.1:6379[3]> zadd z1 11 s4
(integer) 1
127.0.0.1:6379[3]> ZCOUNT zi 1 2  统计分数据在1,2中元素个数
(integer) 0
127.0.0.1:6379[3]> ZCOUNT zi 1 3
(integer) 0
127.0.0.1:6379[3]> ZCOUNT z1 1 3
(integer) 3
127.0.0.1:6379[3]> ZINCRBY z1 1 3
"1"
127.0.0.1:6379[3]> ZRANGE z1 1 3 查看有序集合
1) "s1"
2) "s2"
3) "s3"
127.0.0.1:6379[3]> ZRANGE z1 1 3 withscores 查看有序集合带分数
1) "s1"
2) "1"
3) "s2"
4) "2"
5) "s3"
6) "2"
127.0.0.1:6379[3]> ZINCRBY z1 3 3  有序集合自增
"4"
127.0.0.1:6379[3]> ZRANGE z1 1 3 withscores
1) "s2"
2) "2"
3) "s3"
4) "2"
5) "3"
6) "4"
127.0.0.1:6379[3]> ZRANK z1 s3  根据有序集合中的顺序查看
(integer) 2
127.0.0.1:6379[3]> zrem z1 s3
(integer) 1
127.0.0.1:6379[3]> ZRANGE z1 1 3 withscores 根据有序集合分数查看
1) "s2"
2) "2"
3) "3"
4) "4"
5) "s4"
6) "11"
127.0.0.1:6379[3]> ZREMRANGEBYRANK z1 3 4  根据有序集合顺序删除
(integer) 1
127.0.0.1:6379[3]> ZRANGE z1 1 3 withscores
1) "s2"
2) "2"
3) "3"
4) "4" 
127.0.0.1:6379[3]> ZREMRANGEBYSCORE z1 1 3 根据有序集合分数删除
(integer) 2
127.0.0.1:6379[3]> ZRANGE z1 1 3 withscores
(empty list or set)
127.0.0.1:6379[3]> zadd z1 2 s1
(integer) 1
127.0.0.1:6379[3]> zadd z1 2 s2
(integer) 1
127.0.0.1:6379[3]> zadd z1 2 s3
(integer) 1
127.0.0.1:6379[3]> zadd z1 3 s4
(integer) 1
127.0.0.1:6379[3]> ZSCORE z1 s4
"3"
127.0.0.1:6379[3]> zadd z2 2 s1
(integer) 1
127.0.0.1:6379[3]> zadd z2 2 s2
(integer) 1
127.0.0.1:6379[3]> zadd z2 3 s2
(integer) 0
127.0.0.1:6379[3]> zadd z2 3 s5
(integer) 1

127.0.0.1:6379[3]> help zinterstore

  ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
  summary: Intersect multiple sorted sets and store the resulting sorted set in a new key
  since: 2.0.0
  group: sorted_set

127.0.0.1:6379[3]> ZINTERSTORE z3 1 z1
(integer) 5
127.0.0.1:6379[3]> ZINTERSTORE z3 2 z1 z2 两个有序集合的交集,并保存到z3
(integer) 2
127.0.0.1:6379[3]> ZRANGE z3 0 7
1) "s1"
2) "s2"
127.0.0.1:6379[3]> ZINTERSTORE z3 3 z1 z2
(error) ERR syntax error
127.0.0.1:6379[3]> ZUNIONSTORE z4 2 z1 z2 两个有序集合的并集,并保存到z4
(integer) 6
127.0.0.1:6379[3]> ZRANGE z3 0 7
1) "s1"
2) "s2"
127.0.0.1:6379[3]> ZRANGE z4 0 7
1) "s3"
2) "s4"
3) "s5"
4) "3"
5) "s1"
6) "s2"

[END] 2017/7/31 21:15:37