项目作者: zqhong

项目描述 :
基于 Redis 的有序集实现的排行榜组件,包含:总排行榜、日排行榜、周排行榜、月排行榜、季度排行榜、年排行榜。
高级语言: PHP
项目地址: git://github.com/zqhong/redis-ranking.git


Redis-Ranking

Redis-Ranking 库使用 Redis 的 SortedSet 存储排行数据。其中,

  1. 使用 ZINCRBY 导入单条分数变更记录;
  2. 使用 ZREVRANGE 获取 top x 的用户数据(按照 score 从大到小排序);
  3. 使用 ZRANK 获取某个用户的排名;
  4. 使用 ZSCORE 获取某个用户的分数;

安装

  1. $ composer require -vvv zqhong/redis-ranking

使用

  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. use Predis\Client;
  4. use Zqhong\RedisRanking\Ranking\TotalRanking;
  5. use Zqhong\RedisRanking\RankingManger;
  6. use Zqhong\RedisRanking\Test\Fixture\DummyTotalDataSource;
  7. $redisClient = new Client([
  8. 'scheme' => 'tcp',
  9. 'host' => '127.0.0.1',
  10. 'port' => 6379,
  11. 'password' => 'secret',
  12. 'database ' => 1,
  13. ]);
  14. $rankingManager = (new RankingManger())
  15. // 这里的 DataSource 类需要自己实现
  16. ->setDataSource(new DummyTotalDataSource())
  17. // 设置需要获取的排行数据,目前有:
  18. // 总排行、日排行、周排行、月排行、季排行、年排行
  19. ->setRankingClasses([
  20. TotalRanking::class,
  21. ])
  22. // 设置当前排行数据的 namespace
  23. ->setRankingName('test')
  24. // 注入 Redis 客户端
  25. ->setRedisClient($redisClient)
  26. // 初始化
  27. ->init();
  28. // 获取总排行榜中前三名用户的数据(带分数)
  29. $rankingManager->totalRanking->top(3);
  30. // 获取总排行榜中前三名用户的数据(不带分数)
  31. $rankingManager->totalRanking->top(3, false);
  32. // 获取用户 akira 的排名(总排行榜中)
  33. $rankingManager->totalRanking->rank('akira');
  34. // 获取用户 akira 的分数(总排行榜中)
  35. $rankingManager->totalRanking->score('akira');
  36. // 添加一条分数变更记录(总排行榜)
  37. // 如果用户 test 不存在,则会添加该用户,分数为 1
  38. // 如果用户 test 已存在,该用户的分数则会在原分数基础上 + 1
  39. $rankingManager->totalRanking->add('test', 1);
  40. // 获取参与该排行榜的人数
  41. echo $rankingManager->totalRanking->cardinality();

目前存在问题:

如果排名规则不仅仅是依靠 score 的话,这种方式的实现就不大合适。