redis实现分布式锁

起因 消息队列处理任务中,由于消息队列中有相同的处理请求并且消费端存在多个,因此出现了并发消费的问题,于是产生了利用分布式锁来锁定消费,保证同一时间只有一个请求在处理,找了一下分布式锁的实现方式常见的有: 基于数据库 基于Zookeeper 基于redis 选型 基于数据库相对来说,更直观,实现起来也比较简单,至于要设置一个唯一索引,在插入时判断是否正常插入,不能插入则说明获取锁失败,缺点是会增加数据库开销,增加数据库压力,所以此方案PASS。基于Zookeeper实现分布式锁,会引新的软件,将会增加原有系统的复杂度,因而此方案也PASS。基于 redis 本身是对内存的操作,相对来说效率会非常高,并且原有系统也已经存在了 redis ,因而也不会增加原系统的复杂度,所以选择了 redis 来实现分布式锁。 背景介绍 SETNX key value 将 key 的值设为 value ,当且仅当 key 不存在。若给的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 redis> EXISTS job # job 不存在 (integer) 0 redis> SETNX job "programmer" # job 设置成功 (integer) 1 redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败 (integer) 0 redis> GET job # 没有被覆盖 "programmer" 当 key 不存在时,返回 1, 如果设置的 key 存在时则返回 0 ,该操作本身具有原子性,因此可以利用 redis 此特性进行分布式锁实现的基础。...

December 14, 2018 · 1 min · 云溪