• 首页
  • redis
  • 利用redis 有序集合,轻松搞定排行榜

利用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"


回到顶部