RingQueue.class.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. /**
  3. * 基本redis实现的环形消息队列
  4. * 用法:
  5. * use Com\RingQueue;
  6. * $queue = RingQueue::getInstance('msg');
  7. *
  8. * 加入队列
  9. * $queue->push('aaaaaa');
  10. * $queue->push('bbbbb');
  11. * 读取队列
  12. * $value = $queue->pop()
  13. *
  14. * 删除队列
  15. * $queue->flushQueue();
  16. */
  17. namespace Com;
  18. class RingQueue extends \Think\Cache\Driver\Redis
  19. {
  20. static public $timeout = 1;
  21. static public $queueName = 'ring_queue';
  22. /**
  23. * 取得缓存类实例
  24. * @static
  25. * @access public
  26. * @return mixed
  27. */
  28. public static function getInstance($queueName)
  29. {
  30. if (C('DATA_CACHE_TYPE') != 'Redis') exit('DATA_CACHE_TYPE DO NOT Support Redis');
  31. //当前队列名称
  32. self::$queueName = 'ring_' . $queueName;
  33. static $_instance = array();
  34. if (!isset($_instance[self::$queueName])) {
  35. $_instance[self::$queueName] = new RingQueue();
  36. }
  37. return $_instance[self::$queueName];
  38. }
  39. //设置队列名称
  40. public static function setQueueName($name)
  41. {
  42. self::$queueName = 'ring_' . $name;
  43. }
  44. /**
  45. * 添加队列(lpush)
  46. * @param string $value
  47. * @return int 队列长度
  48. */
  49. public function push($value)
  50. {
  51. return $this->lPush(self::$queueName, $value);
  52. }
  53. /**
  54. * 读取队列,将读取到的值放在队列最左侧
  55. * @return string|nil
  56. */
  57. public function pop()
  58. {
  59. $result = $this->brPop(self::$queueName, self::$timeout);
  60. if (empty($result)) {
  61. return $result;
  62. } else {
  63. //将取出来的值添加到最队列最左侧
  64. $this->lPush(self::$queueName, $result[1]);
  65. return $result[1];
  66. }
  67. }
  68. /**
  69. * 删除一个消息队列
  70. */
  71. public function flushQueue()
  72. {
  73. $this->delete(self::$queueName);
  74. }
  75. /**
  76. * 返回队列长茺
  77. * @return int
  78. */
  79. public function len()
  80. {
  81. return $this->LLEN(self::$queueName);
  82. }
  83. }
  84. ?>