Redis分布式锁

133 阅读2分钟

1. 场景

在分布式环境下,如果需要对某一个共享变量进行多服务器同步访问的时候,就需要用到分布式锁。

2. 特性

互斥性:在任意时刻,只有一个客户端能持有锁
可重入性:同一个线程已经获取到锁,可再次获取到锁
容错性:只要大部分的Redis节点正常运行,客户端就可以加锁和解锁
不会死锁:即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁,加锁和解锁必须是同一个客户端。 

3. 分布式锁实现方式

-数据库锁:基于数据行的方式。在我们需要加锁的时候往数据库中插入一条记录,注意我们在lockKey列上加上了唯一索引,其他线程在请求的时候通过数据库的索引唯一性就限制住了并发,释放锁的时候删除即可。
-基于redis的分布式锁:
-Zookeeper的分布式锁:

4. redis分布式锁:

redis来时实现分布式锁,常用的有三个命令incr、setNx、set
incr:基于incr这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一。 然后其它用户在执行 INCR 操作进行加一时,如果返回的数大于 1 ,说明这个锁正在被使用当中。
setNx:setNx命令实现这种加锁的思路是,如果 key 不存在,将 key 设置为 value ,如果 key 已存在,则 SETNX 不做任何动作。
SETSET 命令包含了设置过期时间的功能。
RedLock:Redlock是一种算法,Redlock也就是 Redis Distributed Lock,可用实现多节点redis的分布式锁。有多个redis节点,这些节点之间既没有主从,也没有集群关系。客户端用相同的key和随机值在每个节点上请求锁,请求锁的超时时间应小于锁自动释放时间。当在超过半数redis上请求到锁的时候,才算是真正获取到了锁。如果没有获取到锁,则把部分已锁的redis释放掉。
· 互斥性:在任何时候,只能有一个客户端能够持有锁;
· 避免死锁:当客户端拿到锁后,即使发生了网络分区或者客户端宕机,也不会发生死锁;(利用key的存活时间);
· 容错性:只要多数节点的redis实例正常运行,就能够对外提供服务,加锁或者释放锁;

5 总结

作为高并发请求过程中的一个工具类,使用非常的频繁,存在任何潜在问题,都可能引起不可估量的后果。所以使用要甚至更甚。