设为首页 收藏本站
查看: 1114|回复: 0

[经验分享] Redis 实现安全队列

[复制链接]

尚未签到

发表于 2017-12-21 18:44:33 | 显示全部楼层 |阅读模式
  原创 2015-12-24 杜亦舒 性能与架构 Redis 实现安全队列
  Redis的列表数据结构可以让我们方便的实现消息队列
  例如用 LPUSH(BLPUSH)把消息入队,用 RPOP(BRPOP)获取消息
  绝大部分的情况下,这些操作都是没问题的,但并不能保证绝对安全
  当 LPOP 返回一个元素给客户端的时候,会从 list 中把该元素移除,这意味着该元素就只存在于客户端的上下文中,如果客户端在处理这个返回元素的过程崩溃了,那么这个元素就永远丢失了
  如何解决?
  redis 有一个 RPOPLPUSH (或者其阻塞版本的 BRPOPLPUSH)命令
  命令格式
  RPOPLPUSH source destination
  原子性地返回并移除 source 列表的最后一个元素, 并把该元素放入 destination 列表的头部
  用这个命令可以保证队列的安全问题:
  使用 RPOPLPUSH 获取消息时,RPOPLPUSH 会把消息返给客户端,同时把该消息放入一个备份消息列表,并且这个过程是原子的,可以保证消息的安全,当客户端成功的处理了消息后,就可以把此消息从备份列表中移除了
  命令的阻塞与非阻塞区别
  redis的命令中,很多都提供了阻塞与非阻塞两个方式
  例如 LPUSH 为非阻塞,BLPUSH 为阻塞方式
  他们的区别是什么?
  唯一的区别是当列表中没有元素时,BRPOP命令会一直阻塞住连接,直到有新元素加入,而RPOP会直接返回nil
  实际应用的区别
  需要从队列获取任务
  如果用非阻塞的方式,代码会是这样
  # 无限循环读取任务队列中的内容
  loop
  $task = RPOR queue
  if $task
  # 如果有任务则执行
  execute($task)
  else
  # 如果没有就等待1秒
  wait 1 second
  当队列中没有任务时,每秒都会调用一次RPOP命令查看是否有新任务,可能会白白浪费很多系统资源,如果在有新任务加入队列时就通知消费者就好了,这个需求就可以使用阻塞式命令来实现
  loop
  # 如果队列中没有任务,BRPOP命令会一直阻塞
  # 0 表示一直等待,永不过期
  $task = BRPOP queue, 0
  # 有返回值就继续执行
  execute($task[1])

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426582-1-1.html 上篇帖子: linux centos7 基于LNMP环境安装redis 下篇帖子: [Node.js]操作redis
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表