org.springframework.boot

spring-boot-starter-integration

org.springframework.integration

spring-integration-redis

Spring Boot 基础知识就不介绍了。

配置分布式锁

@Bean(destroyMethod = “destroy”)

public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {

return new RedisLockRegistry(redisConnectionFactory, “lock”);

}

使用示例

@GetMapping("/redis/lock")

public String lock(@RequestParam(“key”) String key) {

for (int i = 0; i < 10; i++) {

new Thread(() -> {

redisLockService.lock(key);            try {

Thread.sleep(3000L);

} catch (InterruptedException e) {

e.printStackTrace();            }            System.out.println(DateFormatUtils.format(new Date(), “yyyy-MM-dd HH:mm:ss”));

redisLockService.unlock(key);        }        ).start();    }    return “OK”;

}

RedisLockService 是我封装了的一个 Redis 锁服务,代码有点多,这里就不贴了,完整的代码示例在 Github 上,大家可以 Star 一下:

https://github.com/javastacks/spring-boot-best-practice

测试:

http://localhost:8080/redis/lock?key=yeah

输出:

2020-06-23 11:15:34

2020-06-23 11:15:37

2020-06-23 11:15:40

2020-06-23 11:15:43

2020-06-23 11:15:46

2020-06-23 11:15:49

2020-06-23 11:15:52

2020-06-23 11:15:55

2020-06-23 11:15:58

2020-06-23 11:16:01

可以看到每个线程需要等上一个线程休眠 3 秒后才能获取到锁。

源码分析


集成完了,会使用了,还得研究下 RedisLockRegistry 的源码,不然遇到什么坑还得再踩一遍。

RedisLockRegistry 有两个类构造器:

  • connectionFactory:Redis 连接工厂

  • registryKey:锁前缀

  • expireAfter:失效时间(非必须项,

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

默认60秒)

所以,我们要注册 expireAfter 这个选项,默认 60 秒是否满足业务需要,如果超过默认的 60 少时间,否则将导致锁失效。

还有两个和 RedisLockRegistry 相关且很重要的成员变量:

private final String clientId = UUID.randomUUID().toString();

private final Map<String, RedisLock> locks = new ConcurrentHashMap<>();

  • clientId

首先用来标识当前 RedisLockRegistry 实例ID,并且在设置、移除锁的时候都会要用到,用来判断是不是当前的锁注册实例。

  • locks

用来在内存中缓存当前锁注册实例所有锁对象。

获取锁对象

如下面获取锁对象源码所示:

每个 key 在内存中(ConcurrentHashMap)都对应一个锁对象,锁对象有生成过就直接返回,没有就生成再返回,有了这个锁对象才能进行上锁和解锁操作。

这个锁对象(RedisLock)其实也是实现了 Java 中的 java.util.concurrent.locks.Lock 锁接口:

锁对象(RedisLock)也有两个很重要的成员变量:

private final ReentrantLock localLock = new ReentrantLock();

private volatile long lockedAt;

  • localLock

localLock 是一个本地内存可重入锁,每次去 Redis 上锁前,都要用本地 localLock 上锁先,这样能做到尽可能的少往 Redis 上锁,也能从一方面提升锁的性能。

  • lockedAt

lockedAt 上锁时间,移除过时锁会用到。

阻塞上锁

Spring Boot Redis 实现分布式锁,真香,你掌握了多少?相关推荐

  1. Spring Boot Redis 实现分布式锁,真香!!

    之前看很多人手写分布式锁,其实 Spring Boot 现在已经做的足够好了,开箱即用,支持主流的 Redis.Zookeeper 中间件,另外还支持 JDBC. 本篇栈长以 Redis 为例(这也是 ...

  2. Spring Boot Redis 实现分布式锁,真香

    之前看很多人手写分布式锁,其实 Spring Boot 现在已经做的足够好了,开箱即用,支持主流的 Redis.Zookeeper 中间件,另外还支持 JDBC. 本篇栈长以 Redis 为例(这也是 ...

  3. Spring Boot + Redis 实现分布式锁,还有谁不会??

    点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源! 上一篇:Alibaba开源内网高并发编程手册.pdf 一.业务背景 有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数 ...

  4. mybatis if test 判断参数_什么?你还在if判断参数?Spring Boot 注解进行参数校验真香...

    一.依赖 org.springframework.bootspring-boot-starter-validation2.3.3.RELEASE 二.实体类 @TableField("use ...

  5. redis setnx 分布式锁_Spring Boot 整合 Redis 正确的实现分布式锁

    前言 最近在做分块上传的业务,使用到了Redis来维护上传过程中的分块编号. 每上传完成一个分块就获取一下文件的分块集合,加入新上传的编号,手动接口测试下是没有问题的,前端通过并发上传调用就出现问题了 ...

  6. Spring Boot Redis 入门

    本文,我们基于 Spring Boot 2.X 版本. 1. 概述 在快速入门 Spring Boot 整合 Redis 之前,我们先来做个简单的了解.在 Spring 的生态中,我们使用 Sprin ...

  7. 基于 Redis 实现分布式锁思考

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/xuan_lu/article/details/111600302 分布式锁 基于redis实 ...

  8. Redis实现分布式锁的深入探究

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.分布式锁简介 锁 是一种用来解决多个执行线程 访问共享资源 错 ...

  9. redis使用sysc超时_基于redis的分布式锁实现

    随着业务越来越复杂,应用服务都会朝着分布式.集群方向部署,而分布式CAP原则告诉我们,Consistency(一致性). Availability(可用性).Partition tolerance(分 ...

最新文章

  1. 几个定制 iTerm2 的 tip
  2. IDEA运行最简单的Java程序Hello World
  3. 【机器学习算法专题(蓄力计划)】十七、机器学习中决策树算法
  4. 您需要来自pc的权限才能_微信电脑版还是鸡肋吗?微信PC版3.0内测体验
  5. 过拟合和欠拟合_现代深度学习解决方案中的两大挑战:拟合和欠拟合
  6. 电脑鸿蒙操作系统,鸿蒙操作系统面世 华为称“把不可能变为可能”
  7. C++ 布隆过滤器原理及实现
  8. echart雷达图数据图形的填充颜色_数据可视化,职场数据分析都需要哪些常用的图表?...
  9. 【转】prufer编码
  10. 网络中看不见的五大重要安全隐患
  11. 本地音乐播放器Demo
  12. Ubuntu 隐藏上方状态栏、左边任务栏及菜单按钮移到下方居中及隐藏(详细)
  13. Python使用Regular入门
  14. 阿拉伯数字与中文大写转换excel公式
  15. QT QMessageBox 按钮文字更改为中文
  16. ipv4和ipv6地址长度
  17. 计算机管理 未分配磁盘,win7系统对未分配磁盘空间进行分区的操作方法
  18. Jquery获取被选中的复选框的value值
  19. 服装检索相关论文阅读
  20. pictureBox用法

热门文章

  1. 五边形创意画_儿童美术创意绘画图片_儿童美术创意绘画作品
  2. 【龙讯module小课堂】浅谈对gap的认识:PWmat中修正gap的module
  3. 【Unity3D】在Unity中实现UI指向箭头
  4. 安全芯片介绍-身份认证加密芯片方案
  5. 高能所客座用户计算机申请,2020年中科院高能所招收联合培养硕士博士生、客座研究生多名...
  6. sasl java_kafka sasl java api
  7. 基于51单片机及DS18B20温度传感器数码管显示程序
  8. Linux学习-man和Info
  9. 利普希茨连续(Lipschitz continuous)及其应用
  10. 以太坊(9)go-ethereum + mist 开发环境搭建 --mac