如何安全地使用redis的pop命令
2024-09-04 01:31:00
Redis的list经常被当作队列使用,左进右出,一般生产者使用lpush压入数据,消费者调用rpop取出数据。
这是很自然的行为,然而有时会发现lpush成功,但rpop并没有取到数据,特别是一些客户端库封装了rpop操作,添加了调用者无感知的自动重试。数据凭空消失,找不到问题所在。
实际上,这是所有网络类操作存在的共同的天生的问题,即网络超时,pop的数据实际已在对应的连接中,但因为调用者设定的超时被丢弃了。
如何解决这个问题?有多种可选方法,可根据实际采取其中一种。
方法一:调大Redis连接超时值,比如设置成3秒、5秒等,一般能保证6个9以上的成功率,这也是最简单的优化方法。但有个副作用,即对其它异常反应变迟钝了,为降低这个影响,一般在实现时建立pop操作单独一个Redis实例。
方法二:改用lrange+ltrim替代lpop,在处理成功后调用ltrim,这样可做到至少处理一次。本方法时可能产生重复,调用者需要做密等处理。另外普通使用lrange+ltrim还会限定只能有一个消费者,如果是多消费者,则还需结合eval命令,借助lua来实现多消息。
最新文章
- Angular2 组件通信
- Android test---monkey
- TestNG之Factory
- MySQL基础(五)——视图
- PHP包含文件函数include、include_once、require、require_once区别总结
- hdu 2846
- xampp安装时mysql报错
- hibernate--多对一单向关联 (重点!!!)
- Mac下持久化路由配置
- js-刮刮卡效果,由jquery-eraser源码改的vue组件
- element-ui 动态换肤
- 大战Java虚拟机【3】—— 类加载机制
- 工作小结:xml文件导入到oracle
- Altium Designer 10 快捷键笔记
- [CF976E]Well played!
- 2017-9-8-visio制作lcd液晶背景
- python2和python3比较好的共存方法
- ipan笔记
- echo不换行的实现
- WPF ListBox的进阶使用(一)