redission中的锁分类

news2024/11/11 4:47:15

redis 分布式锁的核心命令

redis分布式锁的实现主要是依靠setnxexpire两个命令完成。

注意:由于setnxexpire是两个命令,会存在如果 setnx 是成功的,但是 expire 设置失败,一旦出现了释放锁失败,或 者没有手工释放,那么这个锁永远被占用,其他线程永远也抢不到锁。这种情况有两种解决办法:

  1. 使用set命令时,同时设置过期时间。不再单独是使用expire命令。set key value [EX seconds] [PX milliseconds] [NX|XX]

    EX seconds:设置失效时长,单位秒 、PX milliseconds:设置失效时长,单位毫秒

    NX:key不存在时设置value,成功返回OK,失败返回(nil)

    XX:key存在时设置value,成功返回OK,失败返回(nil)

  2. 使用lua脚本,将加锁的命令放在lua脚本中原子性的执行。

redission 框架

redission 是redis的第三方库,是基于Netty实现的,是高性能的第三方库。其特点:

  • 支持 Redis 单节点(single)模式、哨兵(sentinel)模式、主从(Master/Slave)模式以及集群 (Redis Cluster)模式;
  • 提供丰富的分布式集合,如:Map,Multimap,Set,SortedSet,List,Deque,Queue 等

redission 中的分布式锁种类

总体的Redisson框架的分布式锁类型,大致如下:

  • 可重入锁
  • 公平锁
  • 联锁
  • 红锁
  • 读写锁
  • 信号量、可过期信号量
  • 闭锁(CountDownLatch)

可重入锁(Reentrant Lock)

Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公平锁(Fair Lock)

redission中的公平锁是可重入的,即可重入公平锁。同时有自动过期解锁的功能。

在这里插入图片描述

联锁(MultiLock)

Redisson的RedissonMultiLock对象可以将多个RLock对象关联为一个联锁,每个RLock对象实例可以 来自于不同的Redisson实例。
在这里插入图片描述

红锁(RedLock)

Redisson的RedissonRedLock对象实现了Redlock介绍的加锁算法。该对象也可以用来将多个RLock对 象关联为一个红锁,每个RLock对象实例可以来自于不同的Redisson实例

public void testRedLock(RedissonClient redisson1,RedissonClient redisson2,
RedissonClient redisson3){
    RLock lock1 = redisson1.getLock("lock1");
    RLock lock2 = redisson2.getLock("lock2");
    RLock lock3 = redisson3.getLock("lock3");
	RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
    
    try {
        // 方式1:同时加锁:lock1 lock2 lock3, 红锁在大部分节点上加锁成功就算成功。
        lock.lock();
        // 方式2:尝试加锁,最多等待100秒,上锁以后10秒自动解锁
        boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
    	e.printStackTrace();
    } finally {
    	lock.unlock();
    }
}

读写锁(ReadWriteLock)

Redisson的分布式可重入读写锁RReadWriteLock,Java对象实现了java.util.concurrent.locks.ReadWriteLock接口。同时还支持自动过期解锁。该对象允许同时有多个读取锁,但是最多只能有一个写入锁。
在这里插入图片描述

信号量(Semaphore)

Redisson的分布式信号量(Semaphore)Java对象RSemaphore采用了与 java.util.concurrent.Semaphore相似的接口和用法。

信号量主要用于限制对有限资源的并发访问。例如,如果有一组共享的数据库连接资源,而你希望最多只有特定数量的线程能够同时使用这些连接,就可以使用信号量来进行控制。

在这里插入图片描述

可过期信号量

Redisson的可过期性信号量(PermitExpirableSemaphore)实在RSemaphore对象的基础上,为每个 信号增加了一个过期时间。每个信号可以通过独立的ID来辨识,释放时只能通过提交这个ID才能释放。
在这里插入图片描述

闭锁/倒数闩(CountDownLatch)

Redisson的分布式闭锁(CountDownLatch)Java对象RCountDownLatch采用了与 java.util.concurrent.CountDownLatch相似的接口和用法。
在这里插入图片描述

细说 红锁

RedLock算法思想:

  1. 在分布式环境下,同时向多个redis节点申请锁;
  2. 只有当得到的锁 大于等于 n/2 + 1时(得到过半的redis节点的锁),才算是这个整体的RedLock加锁成功。
  3. 释放锁时,客户端会向所有获取锁时涉及的 Redis 节点发送释放锁的请求。但是,只要大部分节点(通常是超过半数的节点)成功释放了锁,就认为释放锁的操作是成功的。

解决的问题:红锁避免了说仅仅在一个redis实例上 加锁而带来的问题(单一实例出现故障,就会导致加锁出问题)。

红锁的缺点(被弃用):

  1. 时钟同步的问题:红锁的实现依赖于各个节点上的时钟同步。如果节点之间的时钟存在较大偏差,可能会导致锁的获取和释放出现问题。例如,如果一个节点的时钟比其他节点快,可能会导致锁提前过期,从而影响系统的正确性。

  2. 网络分区延迟问题:客户端与某一个redis节点通信出现延迟,会导致不能正确感知是否获得锁。这会影响对 “大多数节点成功获取锁” 这一条件的判断,从而导致不确定是否真正获得了锁。

  3. 节点故障处理:如果故障节点在锁的获取或释放过程中扮演了重要角色,可能会导致锁的状态不一致,从而影响系统的可靠性。(虽然红锁算法通常会尝试在节点故障时进行容错处理,但这种处理可能并不总是完美的,并且可能会引入额外的复杂性和不确定性)

  4. 官方认为它没有经过充分的检验。

红锁的替代方案

红锁被弃用,那可以用什么替代呢?

答:

  1. 用单实例的redis锁;
  2. 用普通的锁,如setNX、或者 redission。

redis 分段锁

Redis分段锁(Sharded Lock 或 Partitioned Lock) 是一种针对高并发场景下的锁机制优化方案。其核心思想是将全局锁分解为多个子锁(段锁),从而降低锁的粒度,减少锁的竞争,提升系统的并发性能。

它可以用于秒杀系统中。Redis分段锁可以有效地在这种高并发场景下提高性能,并确保数据一致性。

举例场景:短时间内,每秒商品A的订单有6000个订单。在该场景中使用redis分段锁的核心点:

  1. 分段:可以基于用户ID或者订单ID来做哈希分段,这样不同的订单就会被分配到不同的锁段中,减少锁的粒度。
    在这里插入图片描述

  2. 每个分段使用一个独立的Redis分布式锁,每个线程只对某一个分段加锁,这样多个线程可以并发操作库存。

而业务流程是:

  1. 订单进入系统:每个订单到达时,首先根据订单ID计算哈希值,确定其属于哪个分段。

  2. 获取分段锁:通过 Redis 分布式锁机制,获取订单对应分段的锁。

    扣减库存:在获取锁成功后,扣减商品库存。

    生成订单:生成订单并保存到数据库。

    释放锁:操作完成后,释放锁,允许其他请求进入该锁段。

超卖问题

分段锁机制减少了订单之间的锁竞争,但需要确保商品库存的一致性。可以将商品库存管理集中在Redis中,以确保每次扣减操作都是原子操作,避免超卖。

也就是异步库存扣减,库存的扣减先存储在redis中,等待并发量小的时候,才同步到数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用华为智驾,开启MPV的下半场

作者 |老缅 编辑 |德新 8月28日,岚图正式对外公布了全球首款搭载华为乾崑智驾和鸿蒙座舱的MPV——全新岚图梦想家。 新车定位「全景豪华科技旗舰MPV」,全系标配四驱,分为四驱鲲鹏版和四驱乾崑版。 其中岚图逍遥座舱和鲲鹏智驾构成的鲲鹏版…

yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距

可实现对图片,视频,摄像头的检测 项目概述 本项目旨在实现一个集成了YOLOv5目标检测算法、图形用户界面(GUI)以及单目测距功能的系统。该系统能够对图片、视频或实时摄像头输入进行目标检测,并估算目标的距离。通过…

【Java】基于JWT+Token实现完整登入功能(实操)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 认识依赖4.2 使用JWT4.3 登入实现4.4 配置拦截器4.5 获取数据 五、总结&…

Unity数据持久化 之 使用Excel.DLL读写Excel表格

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ 终于找到一个比较方便容易读表的方式了,以前用json读写excel转的cvs格式文件我怎么使用怎么别扭&#xf…

合宙4G模组Air780EX——产品规格书

Air780EX 是合宙通信推出的LTE Cat.1 bis通信模块; Air780EX采用移芯EC618平台,支持LTE 3GPP Rel.13 技术; Air780EX 是4G全网通模块,可适应不同的运营商和产品,确保产品设计的最大灵活性。 其主要特点和优势可以总…

(一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别

🍂1、不说废话,现象展示 🍃图片识别 🍃视频识别 自己训练样本 十分简易快速 opencv级联ha

个股场外期权怎么交易?场外期权交易流程是怎样的?

今天带你了解个股场外期权怎么交易?场外期权交易流程是怎样的?个股场外期权是一种非标准化的期权合约,通常在场外市场(OTC市场)由金融机构和投资者之间进行交易。 场外个股期权主要功能 风险管理: 帮助投…

太速科技-基于Kintex-7 XC7K325T的FMC USB3.0四路光纤数据转发卡

基于Kintex-7 XC7K325T的FMC USB3.0四路光纤数据转发卡 一、板卡概述   本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持64bit DDR3容量2GByte,USB3.0接口,HPC的FMC连接器&#xff…

安卓玩机工具-----通用安卓玩机工具 “搞机助手”界面预览 推荐

在网络中有很多很好玩的工具。方便安卓机型联机使用各种功能。系列博文将详细的演示有些工具的特点与使用方法 搞机助手 作者:流水断崖 目前开发功能有:Twrp recovery全自动刷机,免Root冻结、卸载预装软件,免Root激活&#xff…

1-9 图像膨胀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernel np.ones((3, 3), np.uint8) _, binary_image cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) dilated_image cv2.dilate(binary_image, kernel, iterations1) 三、运行现象 四、完整代码 五、完整工程贴出 一、提前准备 …

【vue css】background设置背景图片不显示问题

问题: 如上图所示,添加背景图片页面没有显示 解决: 添加background-position: center center 即可显示 但是不知道为什么添加这个属性就可以,求大神解惑

端口安全老化细节

我们都知道port-security aging-time命令用来配置端口安全动态MAC地址的老化时间,但是后面还可以加上类型: [SW1-GigabitEthernet0/0/1]port-security aging-time 5 type absolute Absolute time 绝对老化 inactivity Inactivity time相对老化 …

网络协议-SSH

SSH(Secure Shell)协议是一种广泛使用的网络协议,用于安全地进行远程登录和数据传输。SSH协议通过加密技术保证了数据的安全性,防止数据在传输过程中被窃听、篡改或伪造。SSH协议的通信认证过程主要包括以下几个步骤: …

JRebel and XRebel离线安装

近期,使用JRebel and XRebel,发现总是安装不上,可能是网络的原因吧。所以就使用离线方式进行安装。 JRebel 是一款用于 Java 开发的生产力工具。它的主要功能是加速开发周期,通过在不重启 JVM 的情况下即时加载代码变更。这样&…

Class3——Esp32|Thonny——网络连接主机-wifi连接(源代码带教程)

废话不多说——直接上配置源码和图片 一.电脑连接到wifi上(不能是5G) 二.网络调试助手信息设置绑定 1.获取电脑wifi信息 2.设置网络调试助手为一致,然后打开,主机地址是上面的192.168.2.149端口自己设置,UDP然后打开…

1-7 掩膜的运用 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 num_pixels np.sum(mask 255) contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) c max(contours, keycv2.contourArea) x, y, w, h cv2.boundingRect(c) M cv2.moments(contours[0]) if contours…

阿里云飞天洛神云网络子系统“齐天”:超大规模云网络智能运维的“定海神针”

云布道师 引言:近日,在南京上秦淮国际文化交流中心举办第八届未来网络发展大会上,阿里云凭借“超大规模云网络智能运维系统”一举斩获由中国通信学会专家组评选的“未来网络领先创新科技成果奖”,本次获奖也体现出阿里云在云网络技…

在VB.net中,如何把20240906转化成日期格式

标题 vb.net中,如何把20240906转化成日期格式 正文 在 VB.NET 中,将一个数字字符串(如 "20240906")转换为日期格式,你可以使用 DateTime.Parse 或 DateTime.TryParse 方法。这些方法可以将符合日期格式的字符…

响应式单位rpx搭配UI产品工具应用

rpx 即响应式 px,一种根据屏幕宽度自适应的动态单位。以 750 宽的屏幕为基准,750rpx 恰好为屏幕宽度 原本的px像素它是一个固定单位,它并不会随着你屏幕的改变而改变,相当于一个死值,不懂得灵活变通 相反,rpx会随着屏幕改变而改变,因为我们设置的高是200…

网络安全基础—加解密原理与数字证书

目录 1) 对称加密和非对称加密 Ⅰ 对称加密算法 Ⅱ 非对称加密算法 Ⅲ 对称和非对称加密比较: 2)数据加密--数字信封 3)数据验证 - 数字签名 4)数字证书 Ⅰ 数字证书格式 Ⅱ 证书的颁发 Ⅲ 证书验证: .验证…