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

【分布式架构】分布式锁Redission

一、流程图

在这里插入图片描述

二、lua脚本实现原理

setnx+expire实现

  1. setnx:判断key是否存在,如果不存在,则获取锁
    setnx的数据结构:<key,<key1,value>>
    key:业务声明的key
    key1:线程id
    value:次数(用来做锁重入的)
  2. expire:设置key的ttl

三、FAQ

  1. 如何保证setnx命令和expire命令的原子性
    Redis 执行 Lua 脚本可以保证原子性。这是 Redis 设计中的一个关键特性,它允许开发者在 Redis 中执行一系列命令,而这些命令要么全部执行(类似事务的mulit和exec)
  2. 如何防止当前线程的分布式锁的key被其他线程删掉
    setnx会存储线程id,删除key的时候判断下value是否是当前线程
  3. 是否支持锁重入
    支持。因为value存的是当前线程的id,每次重入会+1,方法执行完-1,当等于0时候释放锁;
  4. 分布式锁失效的场景
    先事务再加锁的场景会失效;因为并发下,锁先释放,但是事务未提交,下一个线程会读未提交的数据

http://www.mrgr.cn/news/48379.html

相关文章:

  • 前端知识图谱 - JavaScript基础(变量和类型)
  • 【软考高级】系统架构设计师复习笔记-精华版
  • JS信息收集(小迪网络安全笔记~
  • clickhouse一直重启,日志提示structure needs cleaning
  • Python权限系统-前后端分离
  • 如何测量分辨率
  • NumPy 第十一课 -- 广播(Broadcast)
  • MySQL8.0如何优化网卡MTU值,提高数据库性能?
  • 硬盘数据恢复工具:拯救数据丢失的利器
  • Python | Leetcode Python题解之第474题一和零
  • 数据库SQL基础教程(二)
  • 学习 go 语言开发一个月能赚 10 万?
  • Git 常用的操作命令大全
  • 物理学基础精解【73】
  • 连接达梦数据库的N种方式
  • 48 C 语言实战项目——客户信息管理系统
  • 一天认识一个硬件之散热器
  • 华为启动鸿蒙原生应用开发者激励计划 12月31日前上架最高可获10万元
  • Java | Leetcode Java题解之第474题一和零
  • 你能描述一下Java中的JMX(Java Management Extensions)吗?Java中的JavaFX是什么?它与Swing有何不同?
  • MySQL8.0是如何使用SSL/TLS加密提高数据库的安全性的?
  • Promise.race()
  • 大一计算机课程之线性代数
  • int QSqlQuery::size() const
  • 使用 nrm 管理 npm 镜像源
  • Visual Studio Code基础:使用debugpy调试python程序