用Redis来做排行榜存储

Posted by reedboat on Dec 5, 2010 in 编程 |

随着SNS和微博产品的火热,NoSQL概念逐渐的兴起。出现了一大批各种各样的KeyValue存储系统。我比较感兴趣的是MongoDb和Redis, 因为单纯的Key-Value存储系统难以满足各种复杂的逻辑业务, 仍这两个数据库分别加入了一些关系性的特性,如能有效利用会有很好的效果。

redis目前提供四种数据类型:string,list,set,zset(sorted set)和hset(hash set)。
string是最简单的类型,你可以理解成与Memcached一模一个的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。
zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。
hset是另一个set,一个key对应的不再是一个元素而是一个hash表。

zset是个非常好的排行榜存储,一个key对应的一个数据集合,集合中的每个元素包涵两部分,value(待)排序的元素)和score(用来排序的得分依据)。例如用来存储微博关注数排行榜,value可以是微博用户的ID,而score则是该用户的关注数。
而且对于大部分排行榜数据,其实只需要存储Top N的数据,数据量小,效率高,用内存来存储非常合适,排行榜的实时性也可以做到很高。因为数据是用集合来存储的,存储的时候实际上是没有顺序的,排序计算是在获取的时候来做的.如果访问并发量很大的话,还可以再在前面做一个缓存。
利用redis的一个内置操作直接清除TopN外面的元素, 保持存储量的大小。
例如一个需要发布前30名的排行榜,我们使用的时候可以保留前500名的数据,防止需求变化。然后不断的往其中添加新数据,每当集合中的元素达到1000条的时候,进行一次trim操作,将集合的元素数量压缩成500。当获取前30名的时候,同样用redis做一个缓存,缓存时间设成30秒等。

redis zset数据结构支持的操作包括:
– 添加/删除/统计数量
– 修改score
– 获得score/排名
– 获取排名在某个区间的元素集合
– 获取score在某个范围的元素集合/数量
– 清理score/排名在某个区间外的元素
– 交集/并集运算

关于作者
reedboat, 每讯网, 研发经理
执着的技术人,完美的追求者。
PHP、JS职业攻城师。
SNS、SCM、IOS、敏捷开发、推荐算法…

无觅相关文章插件,快速提升流量

Tags: ,

Reply

使用新浪微博登陆

Copyright © 2012 苇叶舟 All rights reserved. Theme by Laptop Geek.