HTML5技术

用Redis实现分布式锁 与 实现任务队列 - __kelly_(5)

字号+ 作者:H5之家 来源:博客园 2015-11-23 08:33 我要评论( )

以上就是用Redis实现任务队列的整一套思路和代码实现的总结和分享,这里我附上正一个实现类的代码,代码里我基本上对每一行进行了注释,方便大家快速看懂并且能模拟应用。想要深入了解的请看整个类的代码: 1 /* *

  以上就是用Redis实现任务队列的整一套思路和代码实现的总结和分享,这里我附上正一个实现类的代码,代码里我基本上对每一行进行了注释,方便大家快速看懂并且能模拟应用。想要深入了解的请看整个类的代码:

1 /** 2 * 任务队列 3 * RedisQueue { ; __construct($param = null) { 9 $this->_redis = RedisFactory::get($param); 10 } * 13 * 入队一个 Task 14 * @param [type] $name 队列名称 15 * @param [type] $id 任务id(或者其数组) 16 * @param integer $timeout 入队超时时间(秒) 17 * @param integer $afterInterval [description] 18 * @return [type] [description] enqueue($name, $id, $timeout = 10, $afterInterval = 0) { (empty($name) || empty($id) || $timeout <= 0) return false; (!$this->_redis->lock->lock("Queue:{$name}", $timeout)) { 26 Logger::get('queue')->error("enqueue faild becouse of lock failure: name = $name, id = $id"); ; 28 } = microtime(true) + $afterInterval; (() { (false === $this->_redis->zset->getScore("Queue:$name", $item)) { 36 $this->_redis->zset->add("Queue:$name", $score, $item); 37 } 38 } ->_redis->lock->unlock("Queue:$name"); ; 44 45 } * 48 * 出队一个Task,需要指定$id 和 $score 49 * 如果$score 与队列中的匹配则出队,否则认为该Task已被重新入队过,当前操作按失败处理 50 * 51 * @param [type] $name 队列名称 52 * @param [type] $id 任务标识 53 * @param [type] $score 任务对应score,从队列中获取任务时会返回一个score,只有$score和队列中的值匹配时Task才会被出队 54 * @param integer $timeout 超时时间(秒) 55 * @return [type] Task是否成功,返回false可能是redis操作失败,也有可能是$score与队列中的值不匹配(这表示该Task自从获取到本地之后被其他线程入队过) dequeue($name, $id, $score, $timeout = 10) { (empty($name) || empty($id) || empty($score)) return false; (!$this->_redis->lock->lock("Queue:$name", $timeout)) { 63 Logger:get('queue')->error("dequeue faild becouse of lock lailure:name=$name, id = $id"); ; 65 } 出队 = $this->_redis->zset->getScore("Queue:$name", $id); 70 $result = false; ($serverScore == $score) { = (float)$this->_redis->zset->delete("Queue:$name", $id); 75 if ($result == false) { 76 Logger::get('queue')->error("dequeue faild because of redis delete failure: name =$name, id = $id"); 77 } 78 } ->_redis->lock->unlock("Queue:$name"); ; 83 } * 86 * 获取队列顶部若干个Task 并将其出队 87 * @param [type] $name 队列名称 88 * @param integer $count 数量 89 * @param integer $timeout 超时时间 90 * @return [type] 返回数组[0=>['id'=> , 'score'=> ], 1=>['id'=> , 'score'=> ], 2=>['id'=> , 'score'=> ]] pop($name, $count = 1, $timeout = 10) { (empty($name) || $count <= 0) return []; (!$this->_redis->lock->lock("Queue:$name")) { 98 Logger::get('queue')->error("pop faild because of pop failure: name = $name, count = $count"); ; 100 } = []; 104 $array = $this->_redis->zset->getByScore("Queue:$name", false, microtime(true), true, false, [0, $count]); (=> $score) { 108 $result[] = ['id'=>$id, 'score'=>$score]; 109 $this->_redis->zset->delete("Queue:$name", $id); 110 } ->_redis->lock->unlock("Queue:$name"); == 1 ? (empty($result) ? false : $result[0]) : $result; 116 } * 119 * 获取队列顶部的若干个Task 120 * @param [type] $name 队列名称 121 * @param integer $count 数量 122 * @return [type] 返回数组[0=>['id'=> , 'score'=> ], 1=>['id'=> , 'score'=> ], 2=>['id'=> , 'score'=> ]] top($name, $count = 1) { (empty($name) || $count < 1) return []; = []; 130 $array = $this->_redis->zset->getByScore("Queue:$name", false, microtime(true), true, false, [0, $count]); (=> $score) { 134 $result[] = ['id'=>$id, 'score'=>$score]; 135 } == 1 ? (empty($result) ? false : $result[0]) : $result; 139 } 140 }

Redis实现任务队列

  

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • HTML5 进阶系列:拖放 API 实现拖放排序 - _林鑫

    HTML5 进阶系列:拖放 API 实现拖放排序 - _林鑫

    2017-05-02 11:02

  • 调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加信息标注 - QISHUANG

    调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加

    2017-04-18 10:02

  • 计算机网络——DNS协议的学习与实现 - 学数学的程序猿

    计算机网络——DNS协议的学习与实现 - 学数学的程序猿

    2017-04-16 10:00

  • 前端实现搜索记录功能也就是天猫app历史记录存储方便浏览 - 今天的代码你撸了嘛

    前端实现搜索记录功能也就是天猫app历史记录存储方便浏览 - 今天的代

    2017-04-12 14:00

网友点评
e