这篇文章主要讲解了“复述分布式锁的实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“复述分布式锁的实现原理是什么”吧!
借助于复述中的命令setnx(键,值),关键不存在就新增,存在就什么都不做。同时有多个客户端发送setnx命令,只有一个客户端可以成功,返回1(真正);其他的客户端返回0(假)。
引用>本教程操作环境:windows7多系统,Redis5.0.10版,戴尔G3电脑。
分布式锁的实现
随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程,多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力,为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。
分布式锁主流的实现方案:
<李>
基于数据库实现分布式锁
李> <李>基于缓存(复述,等)
李> <李>基于管理员
李>这里,我们就基于复述,实现分布式锁。
基本实现
借助于复述中的命令setnx(键,值),关键不存在就新增,存在就什么都不做。同时有多个客户端发送setnx命令,只有一个客户端可以成功,返回1(真正);其他的客户端返回0(假)。
主要使用复述setnx命令
在指定的关键不存在时,为关键设置指定的值
设置成功,返回1。设置失败,返回0
redis>, EXISTS job ,,,,,,,,,,,,,,, #, job 不存在 (整数),0 , redis>, SETNX job “programmer",,,, #, job 设置成功 (整数),1 , redis>, SETNX job “code-farmer",,, #,尝试覆盖,job ,失败 (整数),0 , redis>, GET job ,,,,,,,,,,,,,,,,,, #,没有被覆盖 “programmer"java代码
public void testLock (), {//,执行复述的setnx命令 String uuid =, UUID.randomUUID () .toString (); Boolean lock =, redisTemplate.opsForValue () .setIfAbsent (uuid,“lock",, 5日,TimeUnit.SECONDS); ,//,判断是否拿到锁 if (锁),{//,执行业务逻辑代码//,… ,//,释放锁资源,(保证获取值和删除操作的原子性),LUA脚本保证删除的原子性 String script =,“if redis.call(& # 39;得到# 39;,,键[1]),==,ARGV[1],然后 ,return redis.call(& # 39;德尔# 39;,,键[1]),else return 0,以何种;; this.redisTemplate.execute (new DefaultRedisScript<祝辞(脚本), arrays . aslist (“lock"), arrays . aslist (uuid));//if (StrUtil.equals (uuid, redisTemplate.opsForValue () . get (“lock"))) {//redistemplate.delete (“lock");//} },{else //,其他请求尝试获取锁 testLock (); } }为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:
互斥性。在任意时刻,只有一个客户端能持有锁。
不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。
感谢各位的阅读,以上就是“复述分布式锁的实现原理是什么”的内容了,经过本文的学习后,相信大家对复述分布式锁的实现原理是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
复述分布式锁的实现原理是什么