RedisLeaderboard.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace app\common\controller;
  3. use Redis;
  4. /**
  5. * 使用rediszset的排行榜
  6. * @author harry.lv
  7. *
  8. */
  9. class RedisLeaderboard
  10. {
  11. /**
  12. *
  13. * @var object redis client
  14. */
  15. private $redis;
  16. /**
  17. *
  18. * @var string 放置排行榜的key
  19. */
  20. private $leaderboard;
  21. /**
  22. * 构造函数
  23. * @param object $redis 已连接redis的phpredis的对象
  24. * @param string $leaderboard 字符串,排行榜的key名
  25. */
  26. public function __construct($leaderboard = '') {
  27. $this->redis = new \Redis();
  28. $this->redis->connect('127.0.0.1');
  29. $this->leaderboard = $leaderboard;
  30. }
  31. /**
  32. * 获取当前的排行榜的key名
  33. * @return string
  34. */
  35. public function getLeaderboard()
  36. {
  37. return $this->leaderboard;
  38. }
  39. /**
  40. * 将对应的值填入到排行榜中
  41. * @param $node 对应的需要填入的值(比如用户的id)
  42. * @param number $count 对应的值,默认值为1
  43. * @return Long 1 if the element is added. 0 otherwise.
  44. */
  45. public function addLeaderboard($node, $count = 1)
  46. {
  47. return $this->redis->zAdd($this->leaderboard, $count, $node);
  48. }
  49. /**
  50. * 给出对应的排行榜
  51. * @param int $number 需要给出排行榜数目
  52. * @param bool $asc 排序顺序 true为按照高分为第0
  53. * @param bool $withscores 是否需要分数
  54. * @param callback $callback 用于处理排行榜的回调函数
  55. * @return [] 对应排行榜
  56. */
  57. public function getLeadboard($number, $asc = true, $withscores = false,$callback = null)
  58. {
  59. if ($asc) {
  60. $nowLeadboard = $this->redis->zRevRange($this->leaderboard, 0, $number -1, $withscores);//按照高分数顺序排行;
  61. } else {
  62. $nowLeadboard = $this->redis->zRange($this->leaderboard, 0, $number -1, $withscores);//按照低分数顺序排行;
  63. }
  64. if ($callback) {
  65. //使用回调处理
  66. return $callback($nowLeadboard);
  67. } else {
  68. return $nowLeadboard;
  69. }
  70. }
  71. /**
  72. * 获取给定节点的排名
  73. * @param string $node 对应的节点的key名
  74. * @param string $asc 是否按照分数大小正序排名, true的情况下分数越大,排名越高
  75. * @return 节点排名,根据$asc排序,true的话,第一高分为0,false的话第一低分为0
  76. */
  77. public function getNodeRank($node, $asc = true)
  78. {
  79. if ($asc) {
  80. //zRevRank 分数最高的排行为0,所以需要加1位
  81. return $this->redis->zRevRank($this->leaderboard, $node);
  82. } else {
  83. return $this->redis->zRank($this->leaderboard, $node);
  84. }
  85. }
  86. /**
  87. * 计算给定的一个或多个有序集的并集
  88. */
  89. public function getZunionstore() {
  90. $this->redis->zUnionStore();
  91. }
  92. }