zset 可能是 Redis 提供的最为特色的数据结构,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。它的内部实现用的是一种叫做「跳跃列表」的数据结构。

zset 中最后一个 value 被移除后,数据结构自动删除,内存被回收。

zset 可以用来存粉丝列表,value 值是粉丝的用户 IDscore 是关注时间。我们可以对粉丝列表按关注时间进行排序。

zset 还可以用来存储学生的成绩,value 值是学生的 IDscore 是他的考试成绩。我们可以对成绩按分数进行排序就可以得到他的名次。

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> 
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐