Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • 分布式锁介绍
  • redis实现分布式锁缺陷
  • 可重入锁
  • 锁重试
    • 消息订阅模型
  • 锁超时
  • 主从一致性
  • 分布式锁
Nreal
2024-04-04
目录

锁重试

# 消息订阅模型

锁重试不是立即重新获取锁,而是采用消息订阅释放锁事件和信号量机制;

释放锁Lua脚本:

"if (redis.call('hexists',KEYS[1],ARGV[3])==0)then" +
"return nil;" +
"end; " +
"local counter redis.call('hincrby',KEYS[1],ARGV[3],-1);" +
"if (counter > 0) then" +
"redis.call('pexpire',KEYS[1],ARGV[2]);"
"return 0;" +
"else" +
"redis.call('del',KEYS[1]);" +
"redis.call('publish',KEYS[2],ARGV[1]);" + // 释放锁时发布一个事件;
"return 1;" +
"end; " +
"return nil;"
1
2
3
4
5
6
7
8
9
10
11
12
13

获取锁时设置等待时间,如果等待时间内没有获取释放锁事件的future,直接返回获取锁失败;

可重入锁
锁超时

← 可重入锁 锁超时→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式