当前位置: 首页 > 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主节点获取锁之后,数据还没有同步到其它节点,此时主节点宕机了。选取的新的主节点就会再次获取锁,这就不满足锁的互斥性了。解决方案就是使用红锁,红锁的原理是不能在一个实例上加锁,要在一半以上的实例上加锁。这样主节点宕机之后,就不能在其它节点上加锁了,红锁的实现复杂,性能很差。

相关文章:

  • 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、数据市场
  • 德州疫情最新消息今天/seo查询官方网站
  • 自己做的网站怎么发布win7/培训网站建设
  • jsp网站建设/百度高级检索入口
  • 成都私人网站制作/sem广告
  • 企业网络推广情况介绍/抖音搜索seo代理
  • 西安网站托管商家/关键词优化工具有哪些