什么是key竞争
简而言之,就是多客户端并发型的写一个key,本来按照顺序修改为4,3,2,但是由于并发的原因,导致顺序为4,2,3最后的key值变成3了,这种现象称为竞争key
如何解决redis的并发竞争key
1.分布式锁
总的来说,就是准备一个锁,大家去器强锁,抢到锁后就执行set操作
传统的锁是单点的操作,在分布式环境下,就需要分式锁。
分布式锁可以基于很多方式实现zookeeper、redis,不管是哪种方式实现,基本原理上都差不多:用一个状态值表示锁,对锁的占用和释放通过状态值来标识
什么是分布式锁
为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。
分布式锁的要求
- 互斥性:在任意一个时刻,只有一个客户端持有锁。
- 无死锁:即便持有锁的客户端崩溃或者其他意外事件,锁仍然可以被获取。
- 容错:只要大部分Redis节点都活着,客户端就可以获取和释放锁
分布式锁的一般实现方式
Memcached:利用 Memcached 的 add 命令。此命令是原子性操作,只有在 key 不存在的情况下,才能 add 成功,也就意味着线程得到了锁。
Redis:和 Memcached 的方式类似,利用 Redis 的 setnx 命令。此命令同样是原子性操作,只有在 key 不存在的情况下,才能 set 成功。
Zookeeper:利用 Zookeeper 的顺序临时节点,来实现分布式锁和等待队列。Zookeeper 设计的初衷,就是为了实现分布式锁服务的。
Chubby:Google 公司实现的粗粒度分布式锁服务,底层利用了 Paxos 一致性算法。
2.利用消息队列
Python中典型的就是celery异步任务框架,放在队列中一个一个的执行,这样也可以解决这种总并发型问题
转载:https://blog.csdn.net/sinat_28995003/article/details/88385679