集成电路 主频 晶体管 总线 控制器 内存
主页 正文

Redis分布式锁:Setnx命令的使用与优化

如何使用redis实现分布式锁功能?

由于Redis是单线程的,性能很快,所以更适合全局分布的key。
基本流程是在处理全局资源冲突时,使用全局唯一键来判断是否有其他线程占用某个资源。
如果没有其他线程工作,可以通过添加分布式key来占用这个资源,然后执行下面的任务。
那么通过 Redis 进行锁定有什么作用呢? 简单按键命令:命令为:setnx内部的执行机制是判断这个按键位置是否有数据。
但这里有一个问题,如果占用资源的线程出错退出,来不及释放分布式锁,那么这个锁总是被更好版本​​的锁占用:命令为: 1.SetNx2 。
过期添加同时分发的密钥,添加密钥过期时间。
这样,锁线程退出后,至少在一段时间后,锁才有机会释放。
这里有一个小问题,这两条指令是分开执行的,不是原子操作。
那么理论上来说,第一个订单执行后,出现错误,执行过期订单的可能性就是不执行过期订单。
命令。
一种方法是引用一些开源库。
在2.8版本之后,Redis提供了正式版的解决方案来解决这个问题,即命令:SetKeyValueNxExpireTireMex,将以上两个命令合并为一个命令。
超时后,部分问题解决了,但是锁可能会过期,但是中间执行任务还没有结束。
该线程执行完毕,第二个线程的锁就会被释放。
当第二个线程释放时,否则就是错误的,或者是另一个线程的锁释放了,与预期不符。
如果您只是解决这个问题,则可以在设置值时使用随机数。
但评估值和删除键不是原子操作。
上述方案仍然无法解决超时问题,仍然违背了分布式密钥的初衷。
该怎么办? 解决这个问题的思路是启动另一个线程。
当前线程会定期给出。
有一个开源库可以解决这个问题,而且可能比你的更好。
这个库就是Redisson,很好记,是Redis的孩子,儿子,就是Reidsson。
这个库中有一个组件是supervisor。
如果你继续思考,还会出现更极端的问题。
在数据同步之前,可能会出现无法锁定的问题。
如果你认为这是一个问题,想要解决这个问题,那么这个问题如何解决呢? 其思路是在锁定期间锁定多个Redis服务器。
目前,除非整个集群不可用,否则这种安全性将会提高。
这个问题也被一个开源库解决了,即Redis Red Lock。
下一个问题是分布式密钥吗? 如果要实现递归分发key,则需要在设置值时添加线程信息和key的数量。
但这是一个简单的想法,如果加上过期时间等问题之后,输入密钥可能会更复杂。

Redis的Setnx命令实现分布式锁

首先, 分布式密钥的原理和我们以前讲的锁的原理基本相同; 目的是当多个线程同时运行时。
这是为了确保一次只有一个线程执行操作或方法或变量。

在一个过程中, 这意味着,为了让我们在jvm或应用程序中拥有控制权,java.util并发包提供了这些方法来像锁或关键字锁一样。
锁定已启用。

但是在分布式环境中,如果要保证同一时间只有一个实例可以访问某个资源, 您需要使用分布式锁。
这里我们将介绍使用Redis的setnx命令来实现分布式锁。

事实上, 目前,setnx命令通常指的是redis的setnxkeyvalue命令,但该命令可能在以后的redis版本中被删除。

一般指redis中set命令和nx参数的使用 set命令目前支持很多可选参数:

定义从Redis2.6.12版本开始的行为。
这可以通过命令的字符串参数进行修改:

注入 bean

这里, 同时启动5个线程,发送到redis存储锁密钥(key习惯但需要一贯的要求,到期日期为10秒。
setifabsent动作与setNx命令相同的动作; 这意味着,如果没有这样的关键, SET已成功收到锁。
否则,该集合将被打破,并且将无法获得钥匙。
获得钥匙后, 制作资源功能并发布最新密钥。

活动效果 -

同时只能找到1个螺纹带。

SETNX顺序使用的动作非常简单且舒适。
它将有以下问题:

键, 如果钥匙被占用, 获取价值。
为了确定该值是否是当前的, 线程存储的随机值; 找出设置命令来还原它。

您可以使用WAIL循环重复SETNX顺序,并设置超时以退出循环。

可以尝试避免锁定。
但这不是完全解决的。

删除它时, 第一个值可用于确定该值是否是当前字母中存储的随机值。
使用LUA脚本执行来确保原子。

繁殖罪:

摘要:setnx配置要实现使用不是一个非常困难的解决方案。
使用Redisson库解决上述问题。
以下文章将介绍如何使用它。

redisson实现了分布式键,Redlock实现了分布密钥

热门资讯
苹果手机内存清理免费技巧指南
8086汇编寄存器入门解析
施密特触发器:波形转换与电子电路设计的关键
汉语与英语语法差异解析
逻辑门基本公式
三菱M70攻丝返回等待中故障解析及解决方法
Vue入门深度解析Vue的基本指令
amd驱动安装类型