Spring Boot Redis 实现分布式锁,真香,你掌握了多少?
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 实现分布式锁,真香,你掌握了多少?相关推荐
- Spring Boot Redis 实现分布式锁,真香!!
之前看很多人手写分布式锁,其实 Spring Boot 现在已经做的足够好了,开箱即用,支持主流的 Redis.Zookeeper 中间件,另外还支持 JDBC. 本篇栈长以 Redis 为例(这也是 ...
- Spring Boot Redis 实现分布式锁,真香
之前看很多人手写分布式锁,其实 Spring Boot 现在已经做的足够好了,开箱即用,支持主流的 Redis.Zookeeper 中间件,另外还支持 JDBC. 本篇栈长以 Redis 为例(这也是 ...
- Spring Boot + Redis 实现分布式锁,还有谁不会??
点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源! 上一篇:Alibaba开源内网高并发编程手册.pdf 一.业务背景 有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数 ...
- mybatis if test 判断参数_什么?你还在if判断参数?Spring Boot 注解进行参数校验真香...
一.依赖 org.springframework.bootspring-boot-starter-validation2.3.3.RELEASE 二.实体类 @TableField("use ...
- redis setnx 分布式锁_Spring Boot 整合 Redis 正确的实现分布式锁
前言 最近在做分块上传的业务,使用到了Redis来维护上传过程中的分块编号. 每上传完成一个分块就获取一下文件的分块集合,加入新上传的编号,手动接口测试下是没有问题的,前端通过并发上传调用就出现问题了 ...
- Spring Boot Redis 入门
本文,我们基于 Spring Boot 2.X 版本. 1. 概述 在快速入门 Spring Boot 整合 Redis 之前,我们先来做个简单的了解.在 Spring 的生态中,我们使用 Sprin ...
- 基于 Redis 实现分布式锁思考
以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/xuan_lu/article/details/111600302 分布式锁 基于redis实 ...
- Redis实现分布式锁的深入探究
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.分布式锁简介 锁 是一种用来解决多个执行线程 访问共享资源 错 ...
- redis使用sysc超时_基于redis的分布式锁实现
随着业务越来越复杂,应用服务都会朝着分布式.集群方向部署,而分布式CAP原则告诉我们,Consistency(一致性). Availability(可用性).Partition tolerance(分 ...
最新文章
- 几个定制 iTerm2 的 tip
- IDEA运行最简单的Java程序Hello World
- 【机器学习算法专题(蓄力计划)】十七、机器学习中决策树算法
- 您需要来自pc的权限才能_微信电脑版还是鸡肋吗?微信PC版3.0内测体验
- 过拟合和欠拟合_现代深度学习解决方案中的两大挑战:拟合和欠拟合
- 电脑鸿蒙操作系统,鸿蒙操作系统面世 华为称“把不可能变为可能”
- C++ 布隆过滤器原理及实现
- echart雷达图数据图形的填充颜色_数据可视化,职场数据分析都需要哪些常用的图表?...
- 【转】prufer编码
- 网络中看不见的五大重要安全隐患
- 本地音乐播放器Demo
- Ubuntu 隐藏上方状态栏、左边任务栏及菜单按钮移到下方居中及隐藏(详细)
- Python使用Regular入门
- 阿拉伯数字与中文大写转换excel公式
- QT QMessageBox 按钮文字更改为中文
- ipv4和ipv6地址长度
- 计算机管理 未分配磁盘,win7系统对未分配磁盘空间进行分区的操作方法
- Jquery获取被选中的复选框的value值
- 服装检索相关论文阅读
- pictureBox用法
热门文章
- 五边形创意画_儿童美术创意绘画图片_儿童美术创意绘画作品
- 【龙讯module小课堂】浅谈对gap的认识:PWmat中修正gap的module
- 【Unity3D】在Unity中实现UI指向箭头
- 安全芯片介绍-身份认证加密芯片方案
- 高能所客座用户计算机申请,2020年中科院高能所招收联合培养硕士博士生、客座研究生多名...
- sasl java_kafka sasl java api
- 基于51单片机及DS18B20温度传感器数码管显示程序
- Linux学习-man和Info
- 利普希茨连续(Lipschitz continuous)及其应用
- 以太坊(9)go-ethereum + mist 开发环境搭建 --mac