栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[ Redis06篇] 分布式锁实现的话术表达

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[ Redis06篇] 分布式锁实现的话术表达

如何实现分布式锁,是面试老生常谈的一个问,但是怎么回答的才算好呢,个人认为可以将多种方案一一列举,然后说出其优缺点,以及使用场景,这样回答会比较好。

1.使用Redis如何实现分布式锁

方案一

  • 使用 redis set(k,v ,nx,px) 命令 ,一个命令,设置锁的同时设置失效时间。使用一个命令保证原子性。
  • key 是自己定义的key, value 可以用当前线程的ID或者是 ,建议调用方自定义一个业务标识,在加锁的方法开始可以使用UUID
  • 解锁放在 finally 中 , 由于 redis 没有提供合适的解锁命令 ,这里不能使用 删除,因为 finally 块都能执行,可能出现,自己加的锁被别人删除了的情况,需要使用 lru表达式 ,根据key查到数据,若 value 仍然是一开始传入的标识 (UUID) 则表示是同一个人。再删除key , 使用 lru表达式保证原子性

总结:方案一不支持 锁等待,以及锁续期,
要加其它线程取不到锁等待的话,可以在加锁处设置一个 循环 for(; 适当休眠,后再次抢锁。

方案二

  • 使用** redission客户端 锁续期-看门狗机制**
//获取一把锁,只要锁的名字一样就是同一把锁
RLock lock = redisson.getLock(lockKey);

//1.加锁(自动续期) -  默认失效时间是30秒,启动一个Timeout定时-刷新-每隔10秒判断未执行完-则继续续期30秒
lock.lock();

//2.若设置自定义超时时间则不会续期
lock.lock(10, TimeUnit.SECONDS) //10秒以后自动解锁,自动解锁时间一定要大于业务时间
2.优缺点**
  • 优点:实现相对简单,性能高
  • 在集群状态下不保证唯一获得性。(主从结构中,从还未复制过去,主挂了,从升级为主)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/603460.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号