RedisLeaderboard.php 2.8 KB

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