一、什么是分布式锁不同的进程需要以互斥的方式来访问共享资源 , 这里实现互斥就是分布式锁 。
简单来说就是:同一时间只有一个客户端对共享资源操作 。举个实际例子 , 抢购茅台 , 如果不加锁就会发生超卖的事故 。
文章插图
二、实现分布式锁需要注意的点
- 互斥性:在任何时刻 , 只有一个客户端获得锁 。
- 无死锁:任何时候都能获取锁 , 即使客户端崩溃或者或被分区 。
- 正确性:解铃还须系铃人 , 客户端 A 加的锁只能由客户端 A 解锁 , 其他客户端不能解锁 。
- 容错:只要大部分 redis 节点处于运行状态 , 客户端就能够获取和释放锁 。
https://redis.io/commands/set ) 命令操作:
SET key value [EX seconds|PX milliseconds|KEEPTTL][NX|XX] [GET]
- EX -- 设置指定的过期时间 , 以秒为单位 。
- PX -- 设置指定的过期时间 , 以毫秒为单位 。
- NX -- 仅当该键不存在的时才会设置该键 。
- XX -- 仅当该键存在时才会设置该键 。
只有当 lock_key 不存在时才会设置 lock_key 和 lock_value , 超时时间 10000 毫秒 , 设置成功返回 OK:
文章插图
当 lock_key 存在时返回 nil:
文章插图
Redis 释放锁使用命令: DEL key (
https://redis.io/commands/del )
解锁命令: DEL lock_key 。
Redis 在 2.6.12 之后的版本才加入 [EX seconds|PX milliseconds] [NX|XX] 这些参数
文章插图
在此之前使用 SETNX (
https://redis.io/commands/setnx ) SETNX 是 “ SET if N ot e X ists” 的缩写 。
SETNX 返回 1 说明设置成功 , 返回 0 说明设置失败 。
SETNX 和 EXPIRE 操作之间不是原子性的 , 如果 SETNX 执行成功之后 , 没有执行 EXPIRE 命令 , 就可能会发生死锁 。
Redis 官网声明 SETNX 在将来的版本中可能会被弃用 , 因为 SETNX 实现的功能 set 都能实现 。
文章插图
四、Redis 实现分布式锁注意的点及解决方案
- 防死锁
- 合理设置锁超时时间
- 释放锁要及时
- 只能释放自己加的锁
- 释放锁要保证原子性
推荐阅读
- 开一家豆制品加工厂,豆制品加工厂连锁加盟-
- 怎样开一家便利超市,便利店怎么开连锁-
- 《摩尔庄园》畜棚怎么解锁?
- 可爱手机壁纸 何同学时间锁壁纸高清2021最新
- 锁骨上长了个硬疙瘩
- 锁骨肌肉怎么练
- 玉雕|爱与守护,一个都不落,原来玉锁还能这样戴
- 锁阳粥的功效与作用
- 运动|从130斤瘦成锁骨精,张歆艺的下颌线像刀子,减肥最真实的明星
- 明朝也是闭关锁国吗,明朝闭关锁国和清朝闭关锁国-