半只蚂蚁 发表于 2015-7-23 08:05:07

[转]redis set轻松做排行榜应用

  自:http://pako.iteye.com/blog/1545966
  Author:pako
  email:zealzpc@gmail.com
  最近项目有很多功能要做类似排行榜的功能,当然其实用python来做不难,不过因为排行榜的数据是要做持久化存在数据库里的,如果每次用sql 去查询在做排序 当数据量多起来后会性能很差,而且毕竟还要自己去写相应的操作特别是要查询一个数据前后名次的数据会很繁琐。
  
  当然我写这篇文章就是因为发现了一个好用的工具,它就是redis自带的set类型。
  
  我就不详细解释set是什么能做什么了,直接上代码更能帮助大家理解,有兴趣的可以自己去redis的官网看详细的set类型所支持的操作。
  
  1)使用zadd 方法往test 这个set类型里插入了五条数据
  
  key    score
  one    78
  two    987
  three45
  four    93
  five   100
  
  redis 127.0.0.1:6379> zadd test 78 "one"
  (integer) 1
  redis 127.0.0.1:6379> zadd test 987 "two"
  (integer) 1
  redis 127.0.0.1:6379> zadd test 45 "three"
  (integer) 1
  redis 127.0.0.1:6379> zadd test 93 "four"
  (integer) 1
  redis 127.0.0.1:6379> zadd test 100 "five"
  (integer) 1


key 就是我们用来显示的人名
score 就是我们排行榜用来排序的分数


2)按分数倒序获取名次的排序结果
更数组一样 从0开始-1表示倒数第几

redis 127.0.0.1:6379> zrevrange test 0 -1
1) "two"
2) "five"
3) "four"
4) "one"
5) "three"

如果你用的是python的redis库 那么返回的就是一个list对象

3)查询某人的分数


redis 127.0.0.1:6379> zscore test one
"78"


4)查询某人的名次(分数倒序)

redis 127.0.0.1:6379> zrevrank test one
(integer) 3

3的意思是第四名

5)更新没人的分数同样适用zadd

redis 127.0.0.1:6379> zadd test 99 one
(integer) 0
redis 127.0.0.1:6379> zscore test one
"99"

6)删除某人数据

redis 127.0.0.1:6379> zrem test one
(integer) 1


因为redis是带有持久化存数功能,并且它数据是在内存中操作,所以性能上没有什么问题,基本更排行榜有关的操作 zset这个数据类型都能满足你需求了,没必要自己在造轮子了。
页: [1]
查看完整版本: [转]redis set轻松做排行榜应用