你好,我是猿java。
今天我们分享的内容是:Redis 分布式锁。
Redis 部署方式 {#Redis-部署方式}
单机部署 {#单机部署}
单机部署,顾名思义,只部署一个Redis节点,其优点是简单,简单,简单;缺点也很明显:无法保证高可用。部署图如下:
主从部署 {#主从部署}
主从部署如下图,只能有一个 master节点和 n个 slave节点,其中slave也可以有更多的slave节点,为了保证高可用,通常会采用哨兵部署方式,当 master出现异常时,可以自动从slave中选举新的 master。
集群部署 {#集群部署}
集群部署方式如下图,多个 master节点保存整个集群中的全部数据,而 Redis cluster集群中每个master节点负责不同的slot范围,整个集群包含 16384个slot。
Redis分布式锁原理 {#Redis分布式锁原理}
Redis锁主要利用 Redis 的 SETNX(SET if N ot eXists)命令,表示:如果 key 不存在,才会设置 value,否则不做任何操作。
- 加锁命令:SETNX key value,当 key不存在时,对 key进行设置操作并返回成功,否则返回失败。
- 解锁命令:DEL key,通过删除键值对释放锁,以便其他线程可以通过 SETNX 命令来获取锁。
- 锁超时:EXPIRE key timeout,设置 key 的超时时间,以保证即使锁没有被显式释放,锁也可以在一定时间后自动释放,避免资源被永远锁住。
加锁,解锁核心伪代码如下:
|---------------------------|----------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9
| if (SETNX(key, value) == 1) { EXPIRE(key, 30) try { // 业务逻辑 } finally { DEL(key) } }
|