当前位置: 首页 > news >正文

SETNX的存在问题和redisson进行改进的原理

      首先分布式锁的原理就是当锁不存在时则创建,创建到锁的线程则执行业务。但是在这些操作中会有一些问题,下面是redis命令setNX设置锁的代码片段

if(缓存中有){返回缓存中的数据
}else{获取分布式锁if(获取锁成功){try{查询数据库}finally{释放锁}}}

      首先就是没有办法准确得知try中操作的执行时间,如果设置锁的过期时间过长,会导致效率下降,所以引入了finally,当操作执行完毕后手动删除锁。

      但是如果过期时间过短,可能在操作还没执行完锁就过期了,这个时候另一个线程可以获取锁,而当前线程执行完操作后会执行finally的解锁操作,这就会导致将另一个刚获取锁的线程的锁删除掉。

      所以需要在finally中判断线程与锁的关系,是本线程加的锁才能够删除。

      这个时候又会有问题,如果在一个线程获取锁后执行到finally了,先进行判断锁的归属,判断成功了,在准备执行解锁操作的时候,突然锁过期了,由于CPU的调度另一个线程在这个时候创建了一个新的锁开始执行任务。当CPU转回到本线程执行时,则直接进行删锁操作,就又导致了锁被错删。

      为了解决这个问题,就需要把判断的过程设置为具有原子性的操作,使用lua脚本。

    这样看使用redis命令实现分布式锁比较复杂,所以下面的redisson的方式就更加方便

      redisson实现分布式锁:上面的介绍表明SETNX的问题主要来源于这两点,一是锁过期时间不容易判断,二是操作的原子性,这两点引发了后面一系列的问题。redisson则将解决这些问题的操作都进行了封装,并且其继承了jdk中的LOCK接口,使用自旋的ReentrantLock;redisson主要优化了以下两点

      1.加锁机制:线程去获取锁,获取成功: 执行lua脚本,保存数据到redis数据库。

        线程去获取锁,获取失败: 一直通过while循环尝试获取锁,获取成功后,执行lua脚本,保存数据到redis

        2.WatchDog自动续锁看门狗机制:在一个分布式环境下,假如一个线程获得锁后,突然服务器宕机了,那么这个时候在一定时间后这个锁会自动释放,你也可以设置锁的有效时间(当不设置默认30秒时),这样的目的主要是防止死锁的发生

        如果线程A业务还没有执行完,时间就过了,线程A 还想持有锁的话,就会启动一个watch dog后台线程,不断的延长锁key的生存时间。

        实现:

if(缓存中有){返回缓存中的数据
}else{
RLock lock = redissonClient.getLock("锁名称");
lock.lock();
try {//从数据库中取//查询完成后再存储到redis
}  finally {lock.unlock();
}
}

http://www.xdnf.cn/news/263125.html

相关文章:

  • 【RAG】向量?知识库的底层原理:向量数据库の技术鉴赏 | HNSW(导航小世界)、LSH、K-means
  • 【Hive入门】Hive与Spark SQL深度集成:执行引擎性能全面对比与调优分析
  • C语言蓝桥杯真题代码
  • Go反射-通过反射调用结构体的方法(带入参)
  • 解决奥壹oelove婚恋原生小程序上架问题,彻底解决解对问题增强版旗舰版通用
  • 计算机网络八股文--day4 --传输层TCP与UDP
  • WebAPI项目从Newtonsoft.Json迁移到System.Text.Json踩坑备忘
  • 【项目实践】boost 搜索引擎
  • 基于 JSP 和 Servlet 的数字信息分析小应用
  • 【Linux】驱动开发方法
  • ES6/ES11知识点 续一
  • 人工智能发展史 — 物理学诺奖之 Hopfield 联想和记忆神经网络模型
  • 19:常见的Halcon数据格式
  • 优化01-统计信息
  • 深入解析 SqlSugar 与泛型封装:实现通用数据访问层
  • 图论之幻想迷宫
  • 使用Rust + WebAssembly提升前端渲染性能:从原理到落地
  • 网络安全:sql注入练习靶场——sqli_labs安装保姆级教程
  • 【tcp连接windows redis】
  • c++_2011 NOIP 普及组 (1)
  • Python Django基于小波变换的数字水印技术实现系统【附源码、文档说明】
  • (37)VTK C++开发示例 ---纹理地球
  • 多协议 Tracker 系统架构与传感融合实战 第五章 卡尔曼滤波定位算法实战
  • Linux《进程概念(下)》
  • 【Linux】Petalinux驱动开发基础
  • 物联网智能项目之——智能家居项目的实现!
  • 基于PyTorch的食物图像分类实战:从数据处理到模型训练
  • AAA GitOps详解
  • n8n工作流自动化平台的实操:本地化高级部署
  • 浙大:优化视觉模型的过度思考