Redis对象——有序集合(ZSet) (2)

有序集合比较典型的使用场景就是排行榜系统。例如学生成绩的排名。某视频(博客等)网站的用户点赞、播放排名、电商系统中商品的销量排名等。我们以博客点赞为例。

添加用户赞数

例如小编Tom发表了一篇博文,并且获得了10个赞。

zadd user:ranking arcticle1 10

取消用户赞数

这个时候有一个读者又觉得Tom写的不好,又取消了赞,此时需要将文章的赞数从榜单中减去1,可以使用zincrby。

zincrby user:ranking arcticle1 -1

查看某篇文章的赞数

ZSCORE user:ranking arcticle1

展示获取赞数最多的十篇文章

此功能使用zrevrange命令实现:

zrevrangebyrank user:ranking 0 9 3.2 电话号码(姓名)排序

使用有序集合的ZRANGEBYLEX(点击可查看该命令详细说明)或ZREVRANGEBYLEX可以帮助我们实现电话号码或姓名的排序,我们以ZRANGEBYLEX为例
注意:不要在分数不一致的SortSet集合中去使用 ZRANGEBYLEX和 ZREVRANGEBYLEX 指令,因为获取的结果会不准确。

电话号码排序

我们可以将电话号码存储到SortSet中,然后根据需要来获取号段:

redis> zadd phone 0 13100111100 0 13110114300 0 13132110901 (integer) 3 redis> zadd phone 0 13200111100 0 13210414300 0 13252110901 (integer) 3 redis> zadd phone 0 13300111100 0 13310414300 0 13352110901 (integer) 3

获取所有号码:

redis> ZRANGEBYLEX phone - + 1) "13100111100" 2) "13110114300" 3) "13132110901" 4) "13200111100" 5) "13210414300" 6) "13252110901" 7) "13300111100" 8) "13310414300" 9) "13352110901"

获取132号段:

redis> ZRANGEBYLEX phone [132 (133 1) "13200111100" 2) "13210414300" 3) "13252110901"

获取132、133号段:

redis> ZRANGEBYLEX phone [132 (134 1) "13200111100" 2) "13210414300" 3) "13252110901" 4) "13300111100" 5) "13310414300" 6) "13352110901"

姓名排序

将名称存储到SortSet中:

redis> zadd names 0 Toumas 0 Jake 0 Bluetuo 0 Gaodeng 0 Aimini 0 Aidehua (integer) 6

获取所有人的名字:

redis> ZRANGEBYLEX names - + 1) "Aidehua" 2) "Aimini" 3) "Bluetuo" 4) "Gaodeng" 5) "Jake" 6) "Toumas"

获取名字中大写字母A开头的所有人:

redis> ZRANGEBYLEX names [A (B 1) "Aidehua" 2) "Aimini"

获取名字中大写字母C到Z的所有人:

redis> ZRANGEBYLEX names [C [Z 1) "Gaodeng" 2) "Jake" 3) "Toumas" 小结

本篇文章我们总结了Redis 有序集合对象的内部实现、常用命令以及常用的一些场景,有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。那么大家在项目中对Redis有序集合对象的使用都有哪些场景呢,欢迎在评论区给我留言和分享,我会第一时间反馈!我们共同学习与进步!

参考

《Redis设计与实现》

《Redis开发与运维》

《Redis官方文档》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsppjw.html