利用redis 有序集合,轻松搞定排行榜
redis 在nosql阵营可谓是红的发紫,它比其他nosql产品支持的存储类型比较丰富,而且存储方式比较灵活,试用的成本也不高.
本文简单描述下 redis 下如何实现一个排行榜,缘由是redis 支持一种 有序集合 zset 类型,zset 是set 类型的一个扩展,比原有的类型多了一个顺序属性.此属性在每次插入数据时会自动调整顺序值,保证value值按照一定顺序连续排列.
我们首先插入一些测试数据.
zhangzhi@moke:~$ redis-cli -h 192.168.1.175 -p 6377
我用客户端连接上了 192.168.1.175 服务器的 6377 端口.
192.168.1.175:6377> zadd testset 88 aaa (integer) 1 192.168.1.175:6377> zadd testset 89 bbb (integer) 1 192.168.1.175:6377> zadd testset 95 ccc (integer) 1 192.168.1.175:6377> zadd testset 128 ddd (integer) 1 192.168.1.175:6377> zadd testset 133 eee (integer) 1 192.168.1.175:6377> zadd testset 176 fff (integer) 1
我们在 zset 类型的有序集合 testset 中连续插入了6个 key-value 数据,(模拟学生名 对应 分数)
因为我们插入的数据都是后面的学生比前面的学生分数高,在redis里也是按此顺序存储的.
如何获取某一个同学的分数?
192.168.1.175:6377> zscore testset eee "133"
如何获取一个学生排行榜?
要用到2个关键词 zrangebyscore (升序排列) zrevrangebyscore (倒序排列)
下面我们给定一个分数范围来升序 或者 倒序得到一个排行榜.
192.168.1.175:6377> zrangebyscore testset 80 150 1) "aaa" 2) "bbb" 3) "ccc" 4) "ddd" 5) "eee" 192.168.1.175:6377> zrangebyscore testset 80 100 1) "aaa" 2) "bbb" 192.168.1.175:6377> zrevrangebyscore testset 150 70 1) "eee" 2) "ddd" 3) "ccc" 4) "bbb" 5) "aaa"