当前位置: 首页 > redis, 分布式系统, 缓存系统 > 正文

Redis应用之数据排行

关键字:
1 星2 星3 星4 星5 星 (暂无评分)
Loading ... Loading ...
baidu_share

场景:
大概有300W左右的文章,需要对每个文章加投票功能,用户登录后才能投票,每个用户对每篇文章只能投票一次。文章大概有20几个分类,在每个文章页显示Top5和该文章的当前排名,聚合页显示各分类的Top50。
说明:本实例是使用PHP连接,更多函数的使用方法请查看 Phpredis

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//记录单个文章投票过的所有用户,用于验证用户投票次数,如果是每天/月只能投一次或者其他限制此方法不适合.
$voteUserKey = 'voteUser: ' . $classId . ':' . $topicId; //voteUser类似Mysql里的表名,加上分类ID文章ID组成一个Key
 
//使用Set[集合],如果不存在插入成功返回true,如果存在或者插入失败返回false
$redis = new Redis();
$redis->pconnect('127.0.0.1',6379); //官方分别提供了connect(需要close)和pconnect(有人说这个是带连接池的)两种连接方式
$redis->sAdd($voteUserKey, $userId); //把用户ID作为Value值存储
 
//使用有序集[Sorted set],将将总票数加1(如果不存在将新建,如果存在则加1)
$voteTopKey = 'voteTop:' . $classId; //构建排行榜的Key,因为实际情况是各分类间不具备可比性只出分类的排行
$redis->zIncrBy($voteTopKey, 1, $topicId); //为文章总票数+1
 
//获取排行数据
$redis->zRevRangeByScore($voteTopKey, 50000000, 0, array('withscores' => TRUE, 'limit' => array(0, $num)));
 
//获取该文章的当前排名
$redis->zRevRank($voteTopKey, $topicId);

以上便能获取用户的投票情况且是实时的,还有记录用户的投票日志、主从、备份、过期设置等也是在慢慢摸索和完善。二期还将实现得票趋势[上升、下降、持平],周、月排行等更多的维度的数据,当然这些可以结合Mysql+Redis异步实现。

本文固定链接: http://www.chepoo.com/redis-applied-rankings.html | IT技术精华网

Redis应用之数据排行:等您坐沙发呢!

发表评论