redis 的 LPOP 是原子性的吗?
发布于 7 年前 作者 im-here 13736 次浏览 来自 问答

假如多个程序(进程)同时LPOP同一个list的时候会pop到重复的数据吗?

6 回复

redis所有的基础命令都是原子性的,不用担心多进程取到重复数据的情况

redis的单个command都是原子性的,原因是大部分情况下(不考虑redis 3.x版本的某些情况下使用了多线程),redis是单进程单线程的,客户端的命令请求会被加入到一个内部queue中,redis会按顺序执行它们并返回。因此多个客户端并发请求也是没问题的。

第一你要了解redis的设计,redis其实和node设计有点像,不同点仅仅是redis将命令推入队列,node只是将回调推入队列 如果你了解node那就很好理解了,换句话说,redis每一个操作都是排队进行的,所以你懂的。 这样就可以解释以下现象 1.del一个千万级的hash键,你会发现下一个操作要阻塞很久(redis3.0以上使用了懒删除除外) 2.还有就是如果redis的键存储较大数据会严重拖慢redis性能

redis非原子性的缪论: 有人会说了自己代码里面使用redis先get再set,递增两次只会加1,那是因为两个get更早推入队列导致(即是get,get,set,set),而不是get,set,get,set这样推入队列的

自己动手丰衣足食,证明原子性不靠瞎掰掰。(开启5个实例,直接刚) 上图: 初始化js: init.png ab运行结果: res.png nginx负载均衡配置: nginx.png app1-app5的js和输出: app1.png app2.png app3.png app4.png app5.png 根据上图并未发现存在lpop出相同的数据

@zy445566 非常感谢🤗,祝你早日找到工作

@imhered 我只是调侃,工作肯定有一堆,就是太远了,要不就是觉得公司小了,以后发展会有瓶颈(跟技术无关) 我现在是吃着碗里看着锅而已 被最理想的离家近的大厂刷了,坑的是题目超简单,自己超低水平发挥,现在气的都想打自己

回到顶部