Redis进阶Redission实现分布式锁

server/2024/11/27 19:11:08/

Redis进阶Redission实现分布式

  • 基于Redis实现的各种问题
  • 怎么解决这些问题
  • redisson实现
    • 1、导入依赖
    • 2.注册成Bean
    • 3、代码实现


基于Redis实现的各种问题

基于Redis实现的分布式锁还具有其他问题

不可重入:按照以上的逻辑,我们一个线程只能获取一次锁,我们怎样才能让其可以多次尝试获取锁呢?

解决方案:我们可以将锁保存在Redis的Hash类型中,key用来存储唯一标识,value用来存储count,用来标识获取到锁的次数,每次想要获取到锁首先检验锁是否存在,如果存在检验key是否相等,如果相等说明是获取到锁的线程本身想要再次获取锁,就让count++,当释放锁的时候,让count–,当count为0时删除redis的锁

不能多次尝试获取锁:如果按照上面封装的Redis锁,我们只能尝试获取一次锁就返回结果
解决方案:我们可以给线程设置一个尝试获取锁的时间,让其可以在这个时间内多次获取锁吗

超时释放:当我们因为给锁添加了一个超时释放时间时,常常可能因为业务阻塞原因导致锁被超时释放,这是锁被其他线程获取,多个线程同时执行业务就可能会引发线程安全问题
解决方案:我们可以给锁的删除时间不断续约,让线程一直持有锁不会过期释放直到线程执行业务结束

主从一致性:当我们使用Redis集群时,有主节点和从节点,当主节点收到锁的写入时,会将写入命令发送给其他从节点来同步数据,如果此时主节点发生故障,redis的哨兵会推举新的主节点,但是由于从节点的数据还没有同步,其他线程请求没有进行数据同步的主节点,就会导致多个线程同时获得锁,造成线程安全问题
解决方案:我们可以设置多个主节点,当进行锁插入时,会向每一个主节点发送请求,如果有一个主节点发生故障,导致数据丢失,返回结果和其他主节点不一致,那么结果就是失败的,当所有主节点都返回成功时,结果才是成功的

怎么解决这些问题

redisson工具类可以完美解决这些问题

redisson_30">redisson实现

1、导入依赖

      <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency>

2.注册成Bean

@Configuration
public class RedisConfig {@Beanpublic RedissonClient getRedissonClient(){Config config=new Config();config.useSingleServer().setAddress("redis://localhost:6379").setPassword("");return Redisson.create(config);}
}

3、代码实现

redisson获取锁的方法:

   public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit)//当调用此方法时不传入锁的过期删除时间,会解决锁的过期删除问题public boolean tryLock(long waitTime, TimeUnit unit)

waitTime:线程尝试获取锁的最大时间
leaseTime:设置锁的超时释放时间
TimeUnit:时间单位

解决不可多次尝试获取锁和超时删除实现:

        RLock lock = redissonClient.getLock(keyName);//线程可以在一秒内多次尝试获取锁,如果一秒内还未获取锁返回获取锁失败boolean isLock = lock.tryLock(1L, TimeUnit.SECONDS);

解决主从一致性实现(创建多个主节点):

        RLock lock = redissonClient.getLock(keyName);RLock lock1 = redissonClient.getLock(keyName));RLock lock2 = redissonClient.getLock(keyName));RLock mLock = redissonClient.getMultiLock(lock1, lock2, lock);boolean isLock = lock.tryLock(1L, TimeUnit.SECONDS);

http://www.ppmy.cn/server/145409.html

相关文章

wend看源码-APISJON

项目地址 腾讯APIJSON官方网站 简介 APIJSON 可以定义为一个面向HTTP 协议的JSON 规范&#xff0c;一个面向数据访问层的ORM 框架。其主要工作流程包括&#xff1a;前端按照既定格式组装 JSON 请求报文&#xff0c;通过 APIJSON-ORM 将这些报文直接转换为 SQL 语句&#xff0c…

修复HIve表乱码问题

修改数据库编码 # 修改已存在的hive元数据库&#xff0c;字符编码格式为utf8mb4 mysql> alter database hive character set utf8mb4; # 进入hive元数据库 mysql> use hive;# 查看元数据库字符编码格式 mysql> show variables like character_set_database; 修改…

金铲铲S13双城之战自动拿牌助手

金铲铲S13双城之战自动拿牌助手 基于python&#xff0c;pyautogui和金铲铲自带备战助手实现 B站视频演示效果 shuangcheng.py import timeimport pyautogui import datetimeprint(请关注您的分辨率&#xff0c;此程序需要配合thumbs_x_y.txt文件同时使用) print(简介&#x…

vue 判断mp3是否加载成功

一、需求 vue MP3加载时&#xff0c;有可能遇到后端没有MP3&#xff0c;但是返回有链接。要求获取MP3失败提示用户&#xff0c;MP3获取失败。 二、代码 canPlayAudio(url) { // 判断录音是否加载const audio new Audio(url)return new Promise((resolve, reject) > {audio.…

51单片机从入门到精通:理论与实践指南(一)

单片机在智能控制领域的应用已非常普遍&#xff0c;发展也很迅猛&#xff0c;学习和使用单片机的人员越来越多。虽然新型微控制器在不断推出&#xff0c;但51单片机价格低廉、易学易用、性能成熟&#xff0c;在家电和工业控制中有一定的应用&#xff0c;而且学好了51单片机&…

GaussianDreamer: Fast Generation from Text to 3D Gaussians——点云论文阅读(11)

此内容是论文总结&#xff0c;重点看思路&#xff01;&#xff01; 文章概述 本文提出了一种快速从文本生成3D资产的新方法&#xff0c;通过结合3D高斯点表示、3D扩散模型和2D扩散模型的优势&#xff0c;实现了高效生成。该方法利用3D扩散模型生成初始几何&#xff0c;通过噪声…

力扣-位运算-4【算法学习day.44】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

蓝桥杯每日真题 - 第21天

题目&#xff1a;(空间) 题目描述&#xff08;12届 C&C B组A题&#xff09; 解题思路&#xff1a; 转换单位&#xff1a; 内存总大小为 256MB&#xff0c;换算为字节&#xff1a; 25610241024268,435,456字节 计算每个整数占用空间&#xff1a; 每个 32 位整数占用…