Redis的list经常被当作队列使用,左进右出,一般生产者使用lpush压入数据,消费者调用rpop取出数据。

这是很自然的行为,然而有时会发现lpush成功,但rpop并没有取到数据,特别是一些客户端库封装了rpop操作,添加了调用者无感知的自动重试。数据凭空消失,找不到问题所在。

实际上,这是所有网络类操作存在的共同的天生的问题,即网络超时,pop的数据实际已在对应的连接中,但因为调用者设定的超时被丢弃了。

如何解决这个问题?有多种可选方法,可根据实际采取其中一种。

方法一:调大Redis连接超时值,比如设置成3秒、5秒等,一般能保证6个9以上的成功率,这也是最简单的优化方法。但有个副作用,即对其它异常反应变迟钝了,为降低这个影响,一般在实现时建立pop操作单独一个Redis实例。

方法二:改用lrange+ltrim替代lpop,在处理成功后调用ltrim,这样可做到至少处理一次。本方法时可能产生重复,调用者需要做密等处理。另外普通使用lrange+ltrim还会限定只能有一个消费者,如果是多消费者,则还需结合eval命令,借助lua来实现多消息。

最新文章

  1. Angular2 组件通信
  2. Android test---monkey
  3. TestNG之Factory
  4. MySQL基础(五)——视图
  5. PHP包含文件函数include、include_once、require、require_once区别总结
  6. hdu 2846
  7. xampp安装时mysql报错
  8. hibernate--多对一单向关联 (重点!!!)
  9. Mac下持久化路由配置
  10. js-刮刮卡效果,由jquery-eraser源码改的vue组件
  11. element-ui 动态换肤
  12. 大战Java虚拟机【3】—— 类加载机制
  13. 工作小结:xml文件导入到oracle
  14. Altium Designer 10 快捷键笔记
  15. [CF976E]Well played!
  16. 2017-9-8-visio制作lcd液晶背景
  17. python2和python3比较好的共存方法
  18. ipan笔记
  19. echo不换行的实现
  20. WPF ListBox的进阶使用(一)

热门文章

  1. 基于Mybatis-Plus实现自动化操作创建时间和修改时间
  2. eclipse从svn检出maven项目
  3. IntelliJ IDEA启动一个普通的java web项目的配置
  4. 常用 Git 命令汇总
  5. DOM创建节点
  6. jQuery绑定事件的四种方式:bind、live、delegate、on
  7. android studio学习---快捷键
  8. Android 创建工程
  9. ISO模型学习
  10. C/C++函数调用时传参过程与可变参数实现原理