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

Redis-分布式锁

8.如何基于Redis实现分布式锁?

  1. 在Redis中,通过SETNX来保证互斥,SETNX(SET If Not Exist),如果key不存在直接设置key的值,如果key存在,SETNX啥也不做。
  2. 释放锁就是使用DEL命令删除对应的Key即可,为了防止误删其它的锁,一般需要通过Lua脚本来保证删除操作的原子性。释放锁时先比较vaule值是否相等,如果相等再释放。但是这样实现的分布式锁存在一个问题,如果删除锁的逻辑突然挂掉,那么就锁就会一直存在。我们可以通过EX对锁设置一个过期时间,但是这个时间不好控制,如果操作共享资源的时间大于锁的过期时间,就会导致锁提前释放。
  3. Redission实现的分布式锁可以进行自动续期,它的原理就是基于看门狗实现的,看门狗是专门用来监控和续期锁的。看门狗给锁的默认释放时间是30秒,每过1/3的释放时间就会自动执行续期操作。看门狗在续期之前还会先判断是否需要续期,如果锁指定了过期时间,就不会用到看门狗机制。看门狗的底层是通过Lua脚本和SETNX实现的,Lua脚本就是为了保证操作的原子性。

9.如何实防止重复下单?

当用户下单的时候,可以通过当前用户唯一的key调用setnx来存储,哪怕调用多次也只能调用成功一次。唯一的key使用:用户token+商品的url和重复提交的key,保证当前用户当前商品重复下单操作只能提交一次,其他通过setNX保存失败的都忽略掉。

10.你了解可重入锁吗?

可重入锁就是在一个线程中可以多次获取同一把锁,无需重新获取锁。Reids实现的分布式锁是不可以重入的,但是Redission实现的分布式锁是可以重入的。可重入锁的实现思路是为每个锁设置一个线程ID和重入次数,当重入次数大于0时,需要判断该占有锁的线程和请求获取锁的线程是否为同一个,如果是同一个就将重入次数加1。

11.Redis如何解决集群下分布式锁的可靠性?

Redis集群下,数据同步到其它节点是异步的。如果在Redis主节点获取锁之后,数据还没有同步到其它节点,此时主节点宕机了。选取的新的主节点就会再次获取锁,这就不满足锁的互斥性了。解决方案就是使用红锁,红锁的原理是不能在一个实例上加锁,要在一半以上的实例上加锁。这样主节点宕机之后,就不能在其它节点上加锁了,红锁的实现复杂,性能很差。

http://www.dtcms.com/a/128911.html

相关文章:

  • Shell打印命令返回的数组只显示第一个元素
  • 云豹录屏大师:多功能免费录屏工具
  • Maven 的安装与配置(IDEA)
  • 本地Docker部署开源Web相册图库Piwigo与在线远程访问实战方案
  • TypeScript入门
  • MySQL安装实战分享
  • LINUX基础 [二] - Linux常见指令
  • Unity协程从入门到精通:告别卡顿,用Coroutine优雅处理异步与时序任务 (Day 27)
  • Compose笔记(十六)--ExoPlayer
  • 一、绪论(Introduction of Artificial Intelligence)
  • 多模态大语言模型arxiv论文略读(十五)
  • 【技术派部署篇】Windows本地部署技术派
  • 果篮问题 Python
  • 【论文阅读】RMA: Rapid Motor Adaptation for Legged Robots
  • 最近在工作中感受到了设计模式的重要性
  • SDC命令详解:使用相对路径访问设计对象(current_instance命令)
  • OpenFlow v1.1+流表匹配流程解析
  • DeepSeek私有化部署性能怎么样?企业级AI落地实战解析!
  • vue+leaflet 区域划分_反向遮罩层
  • 深入解析 QuickAPI 三大核心能力:SQL 编辑器、数据 API、数据市场
  • 自然语言处理、计算机视觉与语音处理-AI学习Day3
  • swift菜鸟教程24-25(可选链,自动引用计数)
  • PyTorch张量操作指南:cat、stack、split与chunk的实战拆解
  • vue3中,element-plus中el-input的v-model和value的用法示例
  • 数据结构:哈希表 | C++中的set与map
  • muduo库源码分析: TcpConnection
  • 你的 Linux 服务器连不上网?10 分钟入门网络故障排查
  • 用户态视角理解内核ROP利用:快速从shell到root的进阶
  • 对称加密与非对称加密的特点
  • 深度解析python生成器和关键字yield