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

Redis——》死锁

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

Redis——》死锁

  • 一、死锁场景
  • 二、如何避免死锁
    • 1、两条命令实现:SETNX加锁 + EXPIRE过期时间
      • (1)实现
      • (2)优点
      • (3)缺点
    • 2、一条命令实现:SET加锁 + EXPIRE过期时间
      • (1)实现
      • (2)优点
      • (3)缺点

一、死锁场景

// 加锁
SETNX lock_key 1// 业务逻辑
DO THINGS// 释放锁,删除key
DEL lock_key

以下情况会导致已经获得锁的客户端一直占用锁,其他客户端永远无法获取到锁,这就是死锁:

  1. 程序处理业务逻辑异常,没及时释放锁
  2. 进程挂了,没机会释放锁

二、如何避免死锁

方案:给锁设置一个过期时间
示例:假设操作共享资源的时间不会超过10s,那么加锁时,给这个key设置10s过期。

1、两条命令实现:SETNX加锁 + EXPIRE过期时间

(1)实现

SETNX lock_key 1    // 加锁
EXPIRE lock_key 10  // 10s后自动过期

(2)优点

锁可以被自动释放,其它客户端依旧可以拿到锁

(3)缺点

如果过期时间设置失败,依旧发生死锁问题。

原因:
加锁、设置过期时间是2条命令,这2条命令不能保证是原子操作(一起成功),有可能只执行了第一条,第二条却执行失败

场景:

  1. SETNX执行成功,执行EXPIRE时由于网络问题,执行失败
  2. SETNX执行成功,Redis异常宕机,EXPIRE没有机会执行
  3. SETNX执行成功,客户端异常崩溃,EXPIRE没有机会执行

2、一条命令实现:SET加锁 + EXPIRE过期时间

在Redis 2.6.12之后,Redis扩展了SET命令的参数,可以在SET的同时指定EXPIRE时间,这条操作是原子的。

(1)实现

SET lock_key 1 EX 10 NX // 10s后自动过期

(2)优点

解决死锁问题

(3)缺点

可能发生释放别人的锁(参考链接:Redis——》锁被别人释放)

http://www.lryc.cn/news/147361.html

相关文章:

  • URL重定向漏洞
  • JavaScript(函数,作用域和闭包)
  • C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密
  • 【docker-compose】【nginx】动态配置
  • ExpressLRS开源之接收机固件编译烧录步骤
  • 提取视频文件里的音频和无声视频
  • SpringBoot原理
  • MySQL事务原理、MVCC详解
  • 在Windows操作系统上安装Neo4j数据库
  • 国民八路参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.
  • 24 Linux高级篇-备份与恢复
  • 微信小程序的图书馆预约系统设计与实现
  • 《2023年网信人才培训-网络安全从业人员能力素养提升培训》第一期成功举办
  • WebGpu VS WebGL
  • HTML <tfoot> 标签
  • VScode的PHP远程调试模式Xdebug
  • HTML5-2-链接
  • Java--常用jar命令
  • 微服务中间件--多级缓存
  • clickhouse系列3:clickhouse分析英国房产价格数据
  • 2023京东口腔护理赛道行业数据分析(京东销售数据分析)
  • 安服面试 --- 01
  • ExpressLRS开源之RC链路性能测试
  • el-form表单el-form-item prop一次验证两个值
  • HTTP 代理原理及 Python 简单实现
  • 数据结构--队列与循环队列
  • 八路参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.
  • 版本控制 Git工具的使用
  • GNS3 在 Linux 上的安装指南
  • Mybatis中 list.size() = 1 但显示 All elements are null