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

面试总结-Redis篇章(八)——Redis分布式锁

JAVA 面试总结-Redis分布式锁

  • 模拟抢券场景
      • 通过下面方法添加Synchronized锁来防止上述情况,
        • 如果上面是单体服务没有问题,但是如果项目是集群部署,会出现下面的问题,因为Synchronized是属于本地的锁
        • 端口8080和8081同时访问,那么两个线程会同时加锁
        • 这时候我们需要用分布式锁
  • Redis 分布式锁实现原理
        • Redis实现分布式锁如何合理的控制锁的有效时长?
        • 1.根据业务执行时间预估,2.给锁续期,但是第一种根据业务执行的时间预估依然可能会出现问题,所以我们采用第二种方案给锁续期,但是我们要自己再开一个线程一直关注这个锁吗?Redis 分布式锁就可以实现
      • 加锁,设置过期时间等操作都是基于lua脚本完成
    • 主从一致性
      • 红锁

在这里插入图片描述

模拟抢券场景

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过下面方法添加Synchronized锁来防止上述情况,

在这里插入图片描述

如果上面是单体服务没有问题,但是如果项目是集群部署,会出现下面的问题,因为Synchronized是属于本地的锁

在这里插入图片描述
在这里插入图片描述

端口8080和8081同时访问,那么两个线程会同时加锁

这时候我们需要用分布式锁

在这里插入图片描述
8080端口在进行线程1的时候,进行加锁,此时8081的进行访问的时候获取互斥锁失败,可以保证数据一致

Redis 分布式锁实现原理

在这里插入图片描述
为什么要设置过期时间?如果不设置过期时间的话,有可能导致死锁的问题。

Redis实现分布式锁如何合理的控制锁的有效时长?

1.根据业务执行时间预估,2.给锁续期,但是第一种根据业务执行的时间预估依然可能会出现问题,所以我们采用第二种方案给锁续期,但是我们要自己再开一个线程一直关注这个锁吗?Redis 分布式锁就可以实现

在这里插入图片描述

下面这个线程加锁成功的话,跟上面的流程是一样的,如果加锁不成功,就会循环,不断尝试获取锁,但是也不会一直循环,有设置阈值,循环次数达到阈值就会停止
具体代码:
在这里插入图片描述

加锁,设置过期时间等操作都是基于lua脚本完成

在这里插入图片描述
add1 方法加锁 ,Value.value = 1, 之后调用add2 方法加锁,Value.value = 2, add2 释放锁 Value.value-1变成1 ,之后add1 释放锁 Value.value-1变成0

只有同一个线程才会重入

主从一致性

在这里插入图片描述
假如现在在写入数据到主节点,这时候主节点宕机了,会有一个从节点变成主节点,当有请求来了,继续写入数据,也会尝试获取锁,因为之前的数据没同步过来,这时候就会造成两个线程同时持有同一把锁,但是这样就没有互斥性了,业务还在执行就可能会产生脏数据,因此在Redis中还提供了另外一种锁——红锁

红锁

在这里插入图片描述
其中 n 代表redis中节点的数量,创建锁的个数要大于等于节点的一半才行,来解决主从不一致的问题,但是这种方法实现复杂,性能查并且运维繁琐。
Redis 的思想是AP思想,保证数据最终一致,但是如果必须保证完全实时一致,就需要用CP思想,用zookeeper

在这里插入图片描述
在这里插入图片描述

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

相关文章:

  • 压力测试-商场项目
  • IDEA中文UT方法执行报错问题、wps默认保存格式
  • Vue如何实现编程式导航声明方法,前进和后退导航
  • torch.load 报错 ModuleNotFoundError 或 AttributeError
  • 前端,js , Error in created hook: TypeError ,有bug了
  • 百度文心千帆大模型平台:企业级大模型服务的新航标
  • uniApp低功耗蓝牙一键开门、多对多查找、数组匹配数组、开锁
  • 类和对象|六个默认成员函数|const成员函数|运算符重载
  • 从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理
  • 04mysql查询语句之查询与分页02
  • 原型模式——对象的克隆
  • [SQL挖掘机] - 多表连接
  • Day 14 C++ 对象的初始化和清理
  • Delphi7最佳登录窗体设计
  • 动脑学院Jetpack Compose学习笔记
  • Qt中线程的使用
  • 基于YOLOv8开发构建蝴蝶目标检测识别系统
  • 【已解决】电脑连上网线但无法上网
  • Linux 学习记录57(ARM篇)
  • Doris注意事项,Doris部署在阿里云,写不进去数据
  • 502 Bad GateWay报错的解决方法
  • openpnp - ReferenceStripFeeder 改版零件
  • VoxPoser:使用大语言模型(GPT-4)来对机器人操作的可组合三维值图【论文解读】
  • RISC-V公测平台发布 · 第一个WEB Server “Hello RISC-V world!”
  • Linux 发行版 CentOS 于 Ubuntu 软件的安装、卸载、查找
  • cmd相关操作命令
  • 使用EM算法完成聚类任务
  • ❤️创意网页:创意视觉效果粒子循环的网页动画
  • 【MTI 6.S081 Lab】thread
  • AWS / VPC 云流量监控