Redis——》实现分布式锁

news/2024/11/14 12:09:02/

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Kafka】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】
    总结——》【Linux】
    总结——》【MongoDB】
    总结——》【Elasticsearch】

Redis——》实现分布式锁

  • 一、最简单的实现
    • 1、实现:SETNX加锁+DEL释放锁
    • 2、优点
    • 3、缺点
  • 二、最严谨的实现
    • 1、实现:SET加锁 + 唯一标识 + 过期时间 + Lua脚本释放锁
      • (1)加锁 + 唯一标识 + 过期时间
      • (2)操作共享资源
      • (3)Lua脚本释放锁
    • 2、优点
  • 三、Java实现分布式锁
  • 四、分布式锁可能遇到的问题

一、最简单的实现

1、实现:SETNX加锁+DEL释放锁

// 加锁:如果 key 不存在,才会设置它的值,否则什么也不做
SETNX lock_key 1// 业务逻辑
DO THINGS// 释放锁,删除key
DEL lock_key

2、优点

实现了加锁和释放锁

3、缺点

参考链接:
Redis——》死锁
Redis——》锁被别人释放

容易造成死锁

二、最严谨的实现

1、实现:SET加锁 + 唯一标识 + 过期时间 + Lua脚本释放锁

(1)加锁 + 唯一标识 + 过期时间

SET lock_key unique_value EX expire_time NX

(2)操作共享资源

(3)Lua脚本释放锁

GET判断锁是否归属自己,再DEL释放锁

//Lua脚本语言
//释放锁,先判断这把锁是否归自己持有,比较unique_value是否相等,避免误释放
if redis.call("get",KEYS[1]) == ARGV[1] thenreturn redis.call("del",KEYS[1])
elsereturn 0
end

2、优点

实现了加锁和释放锁,不会出现死锁和释放别人的锁。

三、Java实现分布式锁

参考链接:
Java——》实现分布式锁
Java——》使用Redisson实现分布式锁

四、分布式锁可能遇到的问题

参考链接:
Redis——》死锁
Redis——》如何评估锁过期时间
Redis——》锁被别人释放

可能遇到的问题解决方案
死锁设置过期时间
过期时间评估不好,锁提前过期守护线程,自动续期
锁被别人释放锁写入唯一标识,释放锁时先检查标识,再释放

http://www.ppmy.cn/news/1084349.html

相关文章

Redis 缓存穿透击穿和雪崩

一、说明 Redis 缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对…

【sgTransfer】自定义组件:带有翻页、页码、分页器的穿梭框组件,支持大批量数据的穿梭显示。

特性&#xff1a; 表格宽度可以自定义翻页器显示控件可以自定义列配置项可以设置显示字段列名称、宽度、字段名可以配置搜索框提示文本&#xff0c;支持搜索过滤穿梭框顶部标题可以自定义左右箭头按钮文本可以设置 sgTransfer源码 <template><div :class"$opti…

【大数据实训】基于Hive的北京市天气系统分析报告(二)

博主介绍&#xff1a;✌全网粉丝6W,csdn特邀作者、博客专家、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于大数据技术领域和毕业项目实战✌ &#x1f345;文末获取项目联系&#x1f345; 目录 1. 引言 1.1 项目背景 1 1.2 项目意义 1 2.…

Mac安装Dart时,Homebrew报错 Error: Failure while executing

前言&#xff1a; 最近准备开发Flutter项目时&#xff0c;在安装环境时&#xff0c;安装Homebew时遇到了以下报错信息&#xff0c;在这里分享一下。 报错信息&#xff1a; ~ % brew tap dart-lang/dart > Tapping dart-lang/dart Cloning into /opt/homebrew/Library/Tap…

Prometheus-Rules(规则)

文章目录 一、介绍二、配置 Prometheus 使用规则文件三、 规则文件语法规则文件语法全局Recording rules(记录规则)2 Alerting rules(警报规则)3 模板化如何使用四、检查规则文件语法五、发送警报通知一、介绍 Prometheus规则是一种逻辑表达式,可用于定义有关监控数据的逻…

1921. 消灭怪物的最大数量

原题地址 解法一 排序贪心即可。思想为先计算出每一个怪兽到达城市的时间&#xff0c;然后排序&#xff0c;有小到大进行消灭&#xff0c;此时的下标可视作时间。当怪兽到达城市的时间超过或等于当前时间时&#xff0c;即已经到达了城市&#xff0c;游戏失败&#xff0c;下标…

8月琐碎但值得的事情

8月份结束了&#xff0c;最近心态比较好&#xff0c;慢点就慢点&#xff0c;没有那么着急了&#xff0c;可能是因为着急也没啥办法&#xff0c; 8月是比较开心的一个月&#xff0c;可能是做的事情更有盼头了&#xff0c;可能是看了喜欢的书&#xff0c;可能是我变瘦了&#xff…

03-使用一个不可变对象作为key,红黑树怎么比较大小?

使用一个不可变对象作为key&#xff0c;红黑树怎么比较大小&#xff1f; 答&#xff1a;Java 中的红黑树是通过左旋、右旋的方式来维护树的平衡性&#xff0c;而左旋、右旋又依赖于节点大小的比较。对于使用不可变对象作为key实际上是可以的&#xff0c;因为比较key的大小本身…