文章目录

  • 分布式锁
    • 不可重入Redis分布式锁
  • Redisson
    • 快速入门
      • 可重入的Redis分布式锁
      • Redisson的multiLock

分布式锁

分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。

分布式锁的核心是实现多进程之间互斥,而满足这一点的方式有很多,常见的有三种:

不可重入Redis分布式锁

原理:利用setnx的互斥性;利用ex避免死锁;释放锁时判断线程标示 缺陷:不可重入、无法重试、锁超时失效

实现分布式锁时需要实现的两个基本方法:

  • 获取锁:

    • 互斥:确保只能有一个线程获取锁

      • 添加锁,利用setnx的互斥特性
      • 添加锁过期时间,避免服务宕机引起的死锁

  • 释放锁

    • 手动释放
    • 超时释放:获取锁时添加一个超时时间
# 释放锁,删除即可
DEL key

分布式锁实现,满足:

在获取锁时存入线程标示(可以用UUID表示)
在释放锁时先获取锁中的线程标示,判断是否与当前线程标示一致
如果一致则释放锁
如果不一致则不释放锁

Redisson

https://github.com/redisson/redisson

快速入门

可重入的Redis分布式锁

原理:利用hash结构,记录线程标示和重入次数;利用watchDog延续锁时间;利用信号量控制锁重试等待
缺陷:redis宕机引起锁失效问题

依赖

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

配置Redisson客户端:


import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedisConfig {@Beanpublic RedissonClient redisClient() {Config config = new Config();config.useSingleServer().setAddress("redis://47.96.16.107:6379").setPassword("654321");return Redisson.create(config);}}

使用

@Resource
private RedissonClient redissonClient;@Test
void testRedisson() throws InterruptedException {// 获取锁(可重入),指定锁的名称RLock lock = redissonClient.getLock("anyLock");// 尝试获取锁,参数分别是:获取锁的最大等待时间(期间会重试),锁自动释放时间,时间单位     boolean isLock = lock.tryLock(1, 10, TimeUnit.SECONDS);// 判断释放获取成功     if (isLock) {try {System.out.println("执行业务");} finally {// 释放锁lock.unlock();}}
}

Redisson的multiLock

配置类

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedisConfig {@Beanpublic RedissonClient redisClient1() {Config config = new Config();config.useSingleServer().setAddress("redis://47.96.16.107:6379").setPassword("654321");return Redisson.create(config);}@Beanpublic RedissonClient redisClient2() {Config config = new Config();config.useSingleServer().setAddress("redis://47.96.16.107:6380").setPassword("654321");return Redisson.create(config);}@Beanpublic RedissonClient redisClient3() {Config config = new Config();config.useSingleServer().setAddress("redis://47.96.16.107:6381").setPassword("654321");return Redisson.create(config);}
}

multiLock

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;@Slf4j
@SpringBootTest
class SimpleLockTest {@Resourceprivate RedissonClient redissonClient1;@Resourceprivate RedissonClient redissonClient2;@Resourceprivate RedissonClient redissonClient3;@Testvoid testRedisson() throws InterruptedException {RLock lock1 = redissonClient1.getLock("apple");RLock lock2 = redissonClient2.getLock("apple");RLock lock3 = redissonClient3.getLock("apple");RLock lock = redissonClient1.getMultiLock(lock1, lock2, lock3);//        // 获取锁(可重入),指定锁的名称
//        RLock lock = redissonClient.getLock("anyLock");// 尝试获取锁,参数分别是:获取锁的最大等待时间(期间会重试),锁自动释放时间,时间单位boolean isLock = lock.tryLock(1, 10, TimeUnit.SECONDS);// 判断释放获取成功if (isLock) {try {System.out.println("执行业务");} finally {// 释放锁lock.unlock();}}}

Redis分布式锁Redisson相关推荐

  1. 集群部署中解决定时任务重复执行的问题-redis分布式锁应用

    背景描述 有小伙伴私信我,关于存在定时任务的项目在集群环境下部署如何解决重复执行的问题,PS:定时任务没有单独拆分. 概述:之前的项目都是单机器部署,所以定时任务不会重复消费,只会执行一次.而在集群环 ...

  2. redisson版本_Redisson实现Redis分布式锁的N种姿势

    来源:公众号 阿飞的博客 , 作者 阿飞的博客 前几天发的一篇文章<Redis分布式锁最牛逼的实现>,引起了一些同学的讨论,也有一些同学提出了一些疑问,这是好事儿.本文在讲解如何使用Red ...

  3. Redisson实现Redis分布式锁的N种姿势

    点击蓝色"程序猿DD"关注我哟 来源:阿飞的博客 前几天发的一篇文章<Redlock:Redis分布式锁最牛逼的实现>,引起了一些同学的讨论,也有一些同学提出了一些疑问 ...

  4. Redis 分布式锁的正确实现原理演化历程与 Redisson 实战总结

    Redis 分布式锁使用 SET 指令就可以实现了么?在分布式领域 CAP 理论一直存在. 分布式锁的门道可没那么简单,我们在网上看到的分布式锁方案可能是有问题的. 一步步带你深入分布式锁是如何一步步 ...

  5. redis分布式锁之redisson可重入锁

    1.上篇讲了java里使用setNX实现redis分布式锁,可是这种方法还是有很多弊端的,追求完美的做法可以使用redisson来实现分布式锁,如下: 2.Redisson 是 java 的 Redi ...

  6. redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...

    在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...

  7. Redis 分布式锁没这么简单,网上大多数都有 bug

    Redis 分布式锁这个话题似乎烂大街了,不管你是面试还是工作,随处可见,「码哥」为啥还写? 因为看过很多文章没有将分布式锁的各种问题讲明白,所以准备写一篇,也当做自己的学习总结. 在进入正文之前,我 ...

  8. 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!

    ‍‍‍‍‍‍‍‍‍‍‍‍阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题,很多文章已经写烂了 ...

  9. 这才叫细:带你深入理解Redis分布式锁

    什么是分布式锁 说到Redis,我们第一想到的功能就是可以缓存数据,除此之外,Redis因为单进程.性能高的特点,它还经常被用于做分布式锁. 锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同 ...

最新文章

  1. MySQL-主从架构探索
  2. genius choice for gopro
  3. docker --link容器互联
  4. 18. 4Sum 四数之和
  5. Linux版本配置环境变量,如何linux环境下配置环境变量过程图解
  6. 10个经典的C语言面试基础算法及代码
  7. TensorFlow | ReluGrad input is not finite. Tensor had NaN values
  8. (二)Java中的HashMap与ConcurrentHashMap的区别
  9. -矩阵-创建矩阵-meshgrid函数
  10. 打印浏览器文章为pdf
  11. 如何在linux系统下读写windows上的共享文件夹
  12. 谈谈创业这点事 之 时间窗口
  13. 用谷歌浏览器如何下载哔哩哔哩中的视频
  14. switch服务器维护时间2020,switch pro什么时候出,2020性能加强版switch发布时间
  15. URL.createObjectURL()方法
  16. [译]第一章:什么是管理
  17. 接口与多态:模拟物流快递系统程序设计实验
  18. 网上赚钱怎么赚?锁定一个项目,才是赚钱的王道!
  19. 关于安卓开发的一些你必须要掌握的网络知识(一):网络基础与网络框架OkHttp
  20. 智能服装:引爆2016智能穿戴新发展

热门文章

  1. 秒懂Kotlin之彻底弄懂形变注解out与in
  2. python中iloc用法_python pandas --loc、iloc用法
  3. LBLRTM使用说明
  4. 2022-2027年中国布洛芬缓释片行业市场调研及未来发展趋势预测报告
  5. C# 16 进制字符串转 int
  6. System Center Data Protection Manager (DPM)
  7. 前端与移动开发----webAPI----节点的层次结构,创建元素,注册事件
  8. 1.4半监督生成对抗网络(SGAN)
  9. eclipse设置断点调试
  10. 2022虎年春节拜年祝福语微信小程序源码下载