前言

这段时间看到挺多人使用redis作为分布式锁来进行资源的控制,但是这种写法有挺多问题的,所以才特意写一篇文章让大家讨论一下。

锁的特性

  • 安全性:当一个资源被占用后,其他线程不能占用

  • 容错性:当一个资源被占用后,使用资源的线程或者项目宕机,而这个资源会自动解锁

  • 阻塞锁(可选):当前资源已被加锁,其他线程/进程来加锁是否阻塞等待,还是立即返回。

  • 可重入性(可选):当前锁的持有者是否能再次进入。

  • 公平性(可选):加锁顺序和请求加锁顺序是否一致,还是随机抢锁。

错误用法

@Overridepublic void afterPropertiesSet() throws Exception {ValueOperations<String, Object> stringObjectValueOperations = redisTemplate.opsForValue();// 错误用法1if (Boolean.TRUE.equals(redisTemplate.hasKey("a"))) {stringObjectValueOperations.set("a", "b");try {//执行业务逻辑} finally {redisTemplate.delete("a");}}// 错误用法2if (Boolean.TRUE.equals(stringObjectValueOperations.setIfAbsent("a", "b"))) {try {//执行业务逻辑} finally {redisTemplate.delete("a");}}// 错误用法3if (Boolean.TRUE.equals(stringObjectValueOperations.setIfAbsent("a", "b", 30L, TimeUnit.SECONDS))) {try {//执行业务逻辑} finally {redisTemplate.delete("a");}}}
  1. 从第一个错误用法显而易见就是很有可能多个线程当时都没检测到有key,所有会有多个线程同时到setKey的这个方法,违背了安全性性质

  2. 从第二个错误用法可见,如果当执行业务逻辑的时候,当前节点宕机了,那么就会变成死锁,违背了容错性性质

  3. 从第三个错误用法可以解决30秒内的安全性和容错性,但是有一个地方就是如果执行逻辑超过了30s,那就会有新的线程进入,其实也违背了锁的安全性。

  • 基于以上3点使用方法,笔者均不建议使用。

分布式锁

  1. 使用数据库当分布式锁

  2. 使用redis当分布式锁

  3. 使用Zk当分布式锁

  • 以上三种都是比较常见的,对于笔者而言使用ZK当分布式锁最安全,因为Zk当master宕机后会选举后才会继续工作,而redis使用单实例是没问题的,而笔者使用比较多的使用redis官方推荐的redisson作为DML(分布式锁管理器)管理比较多。

小结

其实以上几个错误用法,笔者都看到很多人这么使用。

推荐

主流Java进阶技术(学习资料分享)

Java面试题宝典

加入Spring技术开发社区

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

使用Redis作为分布式锁的错误用法相关推荐

  1. 【分布式缓存系列】Redis实现分布式锁的正确姿势

    一.前言 在我们日常工作中,除了Spring和Mybatis外,用到最多无外乎分布式缓存框架--Redis.但是很多工作很多年的朋友对Redis还处于一个最基础的使用和认识.所以我就像把自己对分布式缓 ...

  2. Redis实现分布式锁的深入探究

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.分布式锁简介 锁 是一种用来解决多个执行线程 访问共享资源 错 ...

  3. 基于Redis实现分布式锁之前,这些坑你一定得知道

    开头 基于Redis的分布式锁对大家来说并不陌生,可是你的分布式锁有失败的时候吗?在失败的时候可曾怀疑过你在用的分布式锁真的靠谱吗?以下是结合自己的踩坑经验总结的一些经验之谈. 你真的需要分布式锁吗? ...

  4. Redis之分布式锁

    # 基于 Redis 实现分布式锁的三种方案 用 Redis 实现分布式锁的正确姿势(实现一) 用 Redisson 实现分布式可重入锁(RedissonLock)(实现二) 用 Redisson 实 ...

  5. java中使用Redis实现分布式锁

    前言 目前很多大型的互联网公司后端都采用了分布式架构来支撑前端应用,其中服务拆分就是分布式的一种体现,既然服务拆分了,那么多个服务协调工作就会出现一些资源竞争的情况.比如多个服务对同一个表中的数据进行 ...

  6. 实际开发中使用Redis做分布式锁,躲坑指南,收藏起来

    今天我们来聊聊Redis分布式锁,曾经被Redis分布式锁的坑给坑惨了,接下来,我就进行一个完整的整理,希望大家都能避免踩坑. 在分布式系统中,由于redis分布式锁相对于更简单和高效,成为了分布式锁 ...

  7. nx set 怎么实现的原子性_基于Redis的分布式锁实现

    前言 本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结 分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问 ...

  8. 基于Redis的分布式锁和Redlock算法

    来自:后端技术指南针 1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手 ...

  9. 基于 Redis 的分布式锁到底安全吗?

    [完整版] 网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现 ...

最新文章

  1. 互斥量、读写锁长占时分析的利器——valgrind的DRD
  2. qc成果报告范例_QC推进这样做才是货真价值!| 看机电股份的QC报告
  3. 关于不过洋节的通知_国家有规定不许过圣诞节等洋节吗?
  4. Don't be afraid. You are stronger than you think.
  5. 【原创】我的辞职申请(2005-10-27)
  6. 福昕阅读器中删除单个,多个注释,隐藏所有注释。
  7. windows vcpkg下载慢
  8. java一键配置环境_JDK一键安装,配置环境
  9. Java 统计接口消耗时间
  10. 计算机之父 匈牙利“唯一的天才” 冯·诺依曼
  11. 我收藏的短线操作技巧
  12. 编程番外篇:Rider体验与常用功能分享
  13. 计算机组装的规范装机流程,电脑装机详细步骤
  14. QT5.14入门教程GUI(五)第5个QT程序-SpinBox
  15. 2023云南大学应用统计硕士专业考研成功经验分享
  16. 关于ansible自动化运维超级详细
  17. QT界面:重写鼠标事件/实时显示Label中鼠标位置
  18. 小学生猜成语html5攻略,小学生简单猜成语谜语大全附答案
  19. 从美术大家借鉴软件开发
  20. java 文件下载 迅雷下载_java文件下载用迅雷

热门文章

  1. 5G版iPhone更多细节曝光:骁龙X55基带+A14处理器
  2. 沃尔玛牵手Gatik推行自动驾驶试点项目 为客户配送订单
  3. 这就是八成女性不爱用刷脸支付的原因!支付宝:一周内给安排上
  4. 周鸿祎卸任奇安信董事 后者具备上市条件
  5. DIY自己的GNU交叉工具链(i386-arm) 【ZT】
  6. yum安装 vs 源码编译安装
  7. html canvas blob image 污染源
  8. c++自由读写配置ifstream(一)
  9. live555编译、播放示例
  10. Linux PHY几个状态的跟踪