一: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