redis分布式锁相关知识

分类:编程技术 时间:2024-02-20 15:14 浏览:0 评论:0
0
本文与大家分享redis分布式锁的相关知识。小编觉得还是比较实用的,所以分享给大家学习一下。希望您读完本文后有所收获。话不多说,跟着小编一起来看看吧。我们一起来看看吧。

分布式锁一般有三种实现方式: 1、数据库乐观锁; 2、基于Redis的分布式锁; 3.基于ZooKeeper的分布式锁。

这里介绍一下基于Redis的分布式锁的实现。

分布式锁的特性:

可靠性。 首先,为了保证分布式锁可用,我们至少要保证锁的实现同时满足以下四个条件:

互斥性< /强>。在任何时候,只有一个客户端可以持有锁。

不会发生死锁。即使客户端在没有主动持有锁的情况下崩溃如果解锁它,则保证其他客户端随后可以锁定它。

容错。只要大部分Redis节点正常运行,客户端就可以加锁和解锁。

要解铃,必须系铃。加锁和解锁必须由同一个客户端完成。客户端自己无法解锁别人加的锁。

代码实现组件依赖

首先我们需要通过Maven引入Jedis开源组件,并在pom.xml文件中添加以下代码:< /p>< pre class="brush:php;toolbar:false"><依赖项> redis.clients jedis 2.9.0

锁定代码的正确方法

空谈很便宜,给我看看代码。先展示代码,然后解释一下为什么这么实现:

public class RedisTool { private static final String LOCK_SUCCESS = "OK";私有静态最终字符串SET_IF_NOT_EXIST =“NX”;私有静态最终字符串SET_WITH_EXPIRE_TIME =“PX”; /** * 尝试获取分布式锁* @param jedis Redis客户端* @param lockKey锁* @param requestId 请求标识* @param expireTime 过期时间* @return 是否获取成功*/ public static boolean tryGetDistributedLock(Jedis jedis , String lockKey, String requestId, int expireTime) { String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime); if (LOCK_SUCCESS .equals(结果)) { 返回 true;返回假; }}

可以看到,我们只需要一行代码就可以加锁:jedis.set(String key, String value, String nxxx, String expx, int time),这个set()方法有一共有五个形参:

第一个是关键。我们使用钥匙作为锁,因为钥匙是唯一的。

第二个是价值。我们传递的是requestId。很多孩子可能不明白。有钥匙当锁还不够吗?为什么我们需要使用价值?原因是我们上面讲可靠性的时候,分布式锁必须满足第四个条件才能解锁铃铛,并且持有铃铛的人必须是系铃铛的人。通过给requestId赋值,我们就能知道是哪个请求加了锁。解锁的时候就可以有基础了。 requestId 可以使用 UUID.randomUUID().toString() 方法生成。

第三个是nxxx。我们把这个参数填为NX,意思是SET IF NOT.EXIST,即当key不存在时,我们执行set操作;如果key已经存在,则不进行任何操作;

第四个是expx。我们传递的这个参数是PX,这意味着我们要给这个key添加一个过期设置。具体时间由第五个参数决定。

第五个参数是time,与第四个参数对应,代表key的过期时间。

一般来说,执行上面的set()方法只会y 导致两种结果: 1.当前没有锁(key不存在),则执行加锁操作并设置锁的有效期,value代表加锁的客户端。 2.锁已存在,未执行任何操作。

我们的锁定代码满足可靠性部分中描述的三个条件。首先,set()添加了NX参数,保证了如果key已经存在,函数不会调用成功,即只有一个客户端可以持有锁,满足互斥。其次,由于我们给锁设置了过期时间,即使后来锁持有者崩溃而没有解锁,到了过期时间锁也会自动解锁(即删除key),不会出现死锁发生。最后,因为我们给requestId赋值,它代表了锁定的客户端请求标识,那么当客户端解锁时,可以验证是否是同一个客户端。由于我们只考虑场景Redis单机部署的rio,我们暂时不考虑容错。

以上就是redis分布式锁的相关知识。小编相信有些知识点在我们日常工作中可能会看到或者用到。希望您能从本文中了解更多信息。更多详情请关注行业资讯频道。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > redis分布式锁相关知识

用户评论