zset
可能是 Redis
提供的最为特色的数据结构,一方面它是一个 set
,保证了内部 value
的唯一性,另一方面它可以给每个 value
赋予一个 score
,代表这个 value
的排序权重。它的内部实现用的是一种叫做「跳跃列表」的数据结构。
zset
中最后一个 value
被移除后,数据结构自动删除,内存被回收。
zset
可以用来存粉丝列表,value
值是粉丝的用户 ID
,score
是关注时间。我们可以对粉丝列表按关注时间进行排序。
zset
还可以用来存储学生的成绩,value
值是学生的 ID
,score
是他的考试成绩。我们可以对成绩按分数进行排序就可以得到他的名次。
1. sorted set 类型相关命令
命令 | 说明 |
---|---|
zadd key score member | 添加元素到集合,元素在集集合中存在则更新应对的score |
zrem key member | 删除指定元素 |
zcount key min max | 返回分数范围内的成员变量 |
zincrby key incr member | 按照incr幅度增加对应member的score值,返回score值 |
zrank key member | 返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的 |
zrevrank key member | 集合中元素是按score从大到小排序的 |
zrange key start end | 从集合中选择指定区间的元素,返回的是有序集合 |
zrevrange key start end | 同上,返回结果是按score逆序的 |
zcard key | 返回集合中元素的个数 |
zscore key member | 返回给定元素对应的score |
zremrangebyrank key min max | 删除集合中排名在给定区间的元素 |
zinterstore distination numkeys | 相交多个结果集,导致排序的设置存储在一个新的结果集 |
zunionstore destination numberkeys | 添加多个排序集合导致排序的设置存储在一个新的结果集,可以实现取得最大值(max),取得最小值(min) |
2. 使用示例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> zadd jack 90 english
(integer) 1
127.0.0.1:6379> keys *
1) "jack"
127.0.0.1:6379> zadd tom 80 english
(integer) 1
127.0.0.1:6379> keys *
1) "jack"
2) "tom"
127.0.0.1:6379> zrem tom english # 删除指定元素
(integer) 1
127.0.0.1:6379> keys *
1) "jack"
127.0.0.1:6379> zadd tom 80 english
(integer) 1
127.0.0.1:6379> zadd tom 95 math
(integer) 1
127.0.0.1:6379> zadd tom 91 chinese
(integer) 1
127.0.0.1:6379> keys *
1) "jack"
2) "tom"
127.0.0.1:6379> zcount tom 90 100 # 返回分数范围内的成员变量
(integer) 2
127.0.0.1:6379> zincrby tom 3 chinese
"94"
127.0.0.1:6379> zrank tom chinese
(integer) 1
127.0.0.1:6379> zrank tom english
(integer) 0
127.0.0.1:6379> zrank tom math
(integer) 2
127.0.0.1:6379> zrevrank tom math
(integer) 0
127.0.0.1:6379> zrange tom 0 2
1) "english"
2) "chinese"
3) "math"
127.0.0.1:6379> zrevrange tom 0 2
1) "math"
2) "chinese"
3) "english"
127.0.0.1:6379> zcard tom
(integer) 3
127.0.0.1:6379> zscore tom math
"95"
127.0.0.1:6379>
从集合中选择指定区间的元素,返回的是有序集合,如果要加上所携带的分数时,需要使用带有 withscores
字段的语句。
127.0.0.1:6379> zrange tom 0 -1 withscores
1) "english"
2) "80"
3) "chinese"
4) "94"
5) "math"
6) "95"
3. 容器型数据结构的通用规则
list/set/hash/zset
这四种数据结构是容器型数据结构,它们共享下面两条通用规则:
- create if not exists
如果容器不存在,那就创建一个,再进行操作。比如 rpush
操作刚开始是没有列表的,Redis
就会自动创建一个,然后再 rpush
进去新元素。
- drop if no elements
如果容器里元素没有了,那么立即删除元素,释放内存。这意味着 lpop
操作到最后一个元素,列表就消失了。
4. 过期时间
Redis
所有的数据结构都可以设置过期时间,时间到了,Redis
会自动删除相应的对象。需要注意的是过期是以对象为单位,比如一个 hash
结构的过期是整个 hash
对象的过期,而不是其中的某个子 key
。
还有一个需要特别注意的地方是如果一个字符串已经设置了过期时间,然后你调用了 set
方法修改了它,它的过期时间会消失。
127.0.0.1:6379> set str "hello world"
OK
127.0.0.1:6379> expire str 300
(integer) 1
127.0.0.1:6379> ttl str
(integer) 295
127.0.0.1:6379> ttl str
(integer) 294
127.0.0.1:6379> set str "hello"
OK
127.0.0.1:6379> ttl str
(integer) -1
127.0.0.1:6379>