0
点赞
收藏
分享

微信扫一扫

redis的分布式锁

Brose 2022-02-27 阅读 73

我们先来聊一聊redis的部署模式(小编自己的理解,如果有不准确的地方希望大家评论在下面)

1,单机部署

redis如果只部署在一台机器上,那么为了防止脏数据,我们就可以使用synchronized关键字进行加锁,因为此时的请求可以理解在多个线程在向这个redis的这个进程来请求资源,这时我们只需要保证在一个进程内多个线程请求资源的不会因为并发性导致出现数据差异,所以此时我们可以选择加锁,因为是单机部署,所以锁只用考虑在一个进程内。

2,分布式部署

redis如果部署在多台机器上,那么我们就需要保证在多台机器中的进程中,不会出现多个请求在不同的进程中不会对同一数据进行多次修改,导致出现数据差异。所以为了避免这种情况,锁就需要在多个进程中实现共享,这样才能保证数据准确,不会出现差异,所以分布式锁就由此诞生。

我们可以先聊一聊这个锁的设计

首先,如果我们需要一些可以带回一些参数的工具,我看网上大多都在推荐 redis的setnx命令,

SETNX key value 如果key的值存在,就把key设置成value,如果不存在则不做处理,如果key值存在则返回1,key值不存在则返回0。(代码明天补)

大致逻辑是

用setnx命令设置一下,并将value的值设置了系统时间+超时时间,如果设置失败返回0,如果设置成功则返回值为1,之后认为请求拿到锁此时要给进程设置一个过期时间,设置成功之后,进行业务请求,业务请求执行完成之后,释放锁。

但是这样也会出现一下问题,如果在请求拿到锁了之后,在还未设置过期时间之前,由于系统错误或者机器发生死机,因为没设置过期时间,导致锁不能自己释放,其他请求也会一直等待锁的释放,·这就发生了死锁,所以这个设计模式存在一定问题,这个时候网上的方法就有很多,有人提出加事务性,redis支持事务但不支持回滚,但是由于事务性的存在,所有的命令也是全部完成之后才可以去退出,这样就可以避免加完锁后,因为一些外在的因素导致了死锁。

还看到过一个很好的方法

采用对锁时间的判断,他是将value的设置为系统时间+过期时间,获得锁失败的时候进行判断,因为死锁主要是其他人获取不到锁,所以在获得锁失败的时候增加一个措施,就是判断一下锁是否为空或者现在的时间已经超过了之前设置的value值(系统+过期时间),这样之后通过getset命令返回一下旧值 ,之后在设置新的过期时间。

举报

相关推荐

0 条评论