分布式锁的一些认识

Redis中的setnx

在学习redis中,这个setnx key value时,发现分布式锁的原理和这个有点想近所以,在此说一说。

Setnx

这个语句在redis中表示的意思是:判断这个key值是否存在,如果不存在就创建。

场景:假设一个服务器最多能抗压3000(并发),现在又9000个并发到来
一个机器肯定是处理不完的,所以需要多几台服务器

在这里插入图片描述
这个组件可以根据请求的并发数,分配任务。
老生常谈的问题:为什么要用分布式锁?
使用分布式锁的目的,无外乎就是保证同一时间只有一个客户端可以对共享资源进行操作。

所以在这里可以用到setnx语句,第一个程序在访问共享数据时,创建这么一个setnx,在执行完后删除。

在此期间,其他程序在访问的时候,就会先判断这个setnx是否存在,如果存在那么就进入队列等待,等到第一个程序执行完了,这个setnx被删除后再进去同样创建这么一个setnx。

存在的问题

但是存在一个问题,如果有不可抗力的因数导致Redis死亡,一个程序中断了,但是这个setnx没有被删除。那么队列中后所有的程序都被死锁了。

如何解决这个问题?

添加一个expire key过期时间,给setnx添加一个过期的时间,当时间到了就自动删除,就解决了死锁的问题。

新的问题

那么新的问题又来了,如何确定过期时间?
换个说法,万一程序还在执行 这个时间就到了 其他程序又开始访问共享资源了,这就出现的大问题!

如何解决这个问题

这里就要用到我们的守护线程了

用户线程:我们平常创建的普通线程。
守护线程:用来服务于用户线程;不需要上层逻辑介入。

通过这个守护线程我们就解决了这个问题,在每一个程序过期时间快到了时,就由守护线程判断是否还在执行,如果还在执行,那么就让守护线程重置过期时间(续命!!)

以上都是个人学习过程中所发现的一些思路,难登大雅之堂;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值