持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
🍊作者简介:少年不想说话,努力长大
🍊往期回顾:从零开始Redis(七)
🍊近期目标:写完基础源码,点赞👍🏼、收藏⭐、留言📩
今天我们接着前面的数据结构,我们来说说zset结构,开始;
数据结构Zset
说zset我们还是要看它添加命令来引入zset的结构ZADD key [NX|XX] [CH] [INCR] score member [score member ...] ,这样便于理解,这里我们看这几个参数,
nx表示不更新存在的member,只添加成员,
xx表示仅更新存在的member,不添加成员,
CH表示成员发生变化的总数,通常返回的是添加成员的总数,加上它就是返回添加成员的总数和修改分数的成员总数之和,待会看用例;
INCR表示会对member的score进行求和;此处的incr类似于zincrBy命令,就不细说这个命令了;
score代表就是字面意思分数,redis要通过分数来为集合中的成员从小到大排序,相同分数的话会对member按字典顺序排序,而member就是那个成员;我们可以理解成它是有序版的set,key不存在时,则创建一个空的有序集并执行ZADD操作,如果member已经是zset的成员,那么将更新这个member的score值,并将其塞到对应的位置,ZRANGE key start stop [WITHSCORES],表示返回对应范围内的member值,如果想要获取score的话加上WITHSCORES,话不多说,我们看用例;
重复的元素会对key的member的score进行覆盖并重新塞入
127.0.0.1:6379> ZADD zitems 2 mm 2 aa 9 zz 7 qq 5 aa 2 bb
(integer) 5
相同score的会对member按字典顺序排
127.0.0.1:6379> ZRANGE zitems 0 -1 withscores
1) "bb"
2) "2"
3) "mm"
4) "2"
5) "aa"
6) "5"
7) "qq"
8) "7"
9) "zz"
10) "9"
增加incr会对bb的score进行增加并重新塞入
127.0.0.1:6379> ZADD zitems INcR 5 bb
"7"
下面这个我们要说CH的作用我们看用例才好理解
127.0.0.1:6379> ZADD zitemsm 2 mm
(integer) 1
默认只返回新增的个数,变化的不返回
127.0.0.1:6379> ZADD zitemsm 3 mm 4 nn
(integer) 1
127.0.0.1:6379> ZADD zii CH 2 mm
(integer) 1
返回新增的和变化的
127.0.0.1:6379> ZADD zii CH 3 mm 4 nn
(integer) 2
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count],表示返回分数在min到max范围内的成员,至于**[LIMIT offset count]**和sql是差不多的就不多说,我们看个例子;
127.0.0.1:6379> ZRANGE zitem 0 -1 withscores
1) "bb"
2) "2"
3) "mm"
4) "2"
5) "aa"
6) "5"
7) "qq"
8) "7"
9) "zz"
10) "9"
127.0.0.1:6379> ZRANGEBYSCORE zitem 2 7 withscores
1) "bb"
2) "2"
3) "mm"
4) "2"
5) "aa"
6) "5"
7) "qq"
8) "7"
对于zrange和ZRANGEBYSCORE他们同样存在反向的顺序命令ZREVRANGE和 ZREVRANGEBYSCORE两个命令,这里我们就举例ZREVRANGEBYSCORE这个命令,**ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count],**就一句话按由大到小顺序排序;同上例;
127.0.0.1:6379> ZREVRANGEBYSCORE zitem 7 2 withscores
1) "qq"
2) "7"
3) "aa"
4) "5"
5) "mm"
6) "2"
7) "bb"
8) "2"
有一说一,写zset手生的很,要从头学习那种,真的很少用,网上看了某些教程说了zset的机构是基于hash结构和跳跃表结构的,不想深入了,有兴趣可以自行了解哈希存储和跳跃表链表查询效率;对于现实场景中它可以做啥我也没让其在生产环境使用上,无法验证其在真实场景下的缺陷,对于网上说的排名啥的按照目前逻辑的确是可以,至于有没有注意项,恐怕只有经历过才会知道吧,好啦🥗🥗🥗;
结束结束,那就🛴🛴🛴
如果对你有所帮助
点个赞呗