Spring Integration实现分布式锁
学习本篇之前,可以先看下文章 什么是分布式锁,了解下基本概念。
之前都是手写一个分布式锁,其实Spring早就提供了分布式锁的实现。早期,分布式锁的相关代码存在于Spring Cloud的子项目Spring Cloud Cluster中,后来被迁移到Spring Integration中。
Spring Integration提供的全局锁,目前为这几种存储提供了实现:Gemfire、JDBC、Redis、Zookeeper
它们使用相同的API抽象--这正是Spring最擅长的。这意味着,不论使用哪种存储,你的编码体验都是一样的,有一天想更换实现,只需要修改依赖和配置就可以了,无需修改代码
下面以Redis为例,讲解Spring Integration如何使用分布式锁。
1、增加依赖:
<dependency>
<!-- spring integration -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<!-- spring integration与redis结合,实现redis分布式锁 -->
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-redis</artifactId>
</dependency>
<dependency>
<!-- redis -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置文件增加redis配置:
spring:
redis:
port:
host: localhost
3、增加RedisLock的配置类:
@Configuration
public class RedisLockConfiguration { @Bean
public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
return new RedisLockRegistry(redisConnectionFactory, "spring-cloud");
} }
4、增加测试方法:
@RestController
@RequestMapping("redis")
public class RedisController { @Autowired
private RedisLockRegistry redisLockRegistry; private int num = ; /**
* 测试redis分布式锁(没有锁)
*/
@GetMapping("testUnLock")
public void testUnLock() throws InterruptedException {
String s = Thread.currentThread().getName();
if (num > ) {
System.out.println(s + "排号成功,号码是:" + num);
num--;
} else {
System.out.println(s + "排号失败,号码已经被抢光");
}
} /**
* 测试redis分布式锁(有锁)
*/
@GetMapping("testLock")
public void testLock() throws InterruptedException {
Lock lock = redisLockRegistry.obtain("lock");
boolean isLock = lock.tryLock(, TimeUnit.SECONDS);
String s = Thread.currentThread().getName();
if (num > && isLock) {
System.out.println(s + "排号成功,号码是:" + num);
num--;
} else {
System.out.println(s + "排号失败,号码已经被抢光");
}
lock.unlock();
} }
使用压测工具(如:JMeter),开启25个线程,循环一次:

先测试一下没有加锁,会出现什么结果。请求 http://localhost:18081/redis/testUnLock:
http-nio--exec-22排号成功,号码是:
http-nio--exec-28排号成功,号码是:
http-nio--exec-16排号成功,号码是:
http-nio--exec-30排号成功,号码是:
http-nio--exec-26排号成功,号码是:
http-nio--exec-15排号成功,号码是:
http-nio--exec-15排号成功,号码是:
http-nio--exec-3排号成功,号码是:
http-nio--exec-26排号成功,号码是:
http-nio--exec-15排号成功,号码是:
http-nio--exec-3排号成功,号码是:
http-nio--exec-15排号成功,号码是:
http-nio--exec-30排号成功,号码是:
http-nio--exec-26排号成功,号码是:
http-nio--exec-3排号成功,号码是:
http-nio--exec-15排号成功,号码是:
http-nio--exec-3排号成功,号码是:
http-nio--exec-26排号成功,号码是:
http-nio--exec-15排号成功,号码是:
http-nio--exec-3排号成功,号码是:
http-nio--exec-30排号失败,号码已经被抢光
http-nio--exec-22排号成功,号码是:
http-nio--exec-28排号成功,号码是:
http-nio--exec-15排号成功,号码是:
http-nio--exec-16排号成功,号码是:
从上面结果可以看到,num变量的有些值被多个线程同时获取,导致20个号被24个线程获取
再来试下加锁的,请求 http://localhost:18081/redis/testLock:
http-nio--exec-2排号成功,号码是:
http-nio--exec-142排号成功,号码是:
http-nio--exec-141排号成功,号码是:
http-nio--exec-171排号成功,号码是:
http-nio--exec-152排号成功,号码是:
http-nio--exec-159排号成功,号码是:
http-nio--exec-154排号成功,号码是:
http-nio--exec-156排号成功,号码是:
http-nio--exec-142排号成功,号码是:
http-nio--exec-158排号成功,号码是:
http-nio--exec-172排号成功,号码是:
http-nio--exec-161排号成功,号码是:
http-nio--exec-160排号成功,号码是:
http-nio--exec-164排号成功,号码是:
http-nio--exec-162排号成功,号码是:
http-nio--exec-171排号成功,号码是:
http-nio--exec-170排号成功,号码是:
http-nio--exec-152排号成功,号码是:
http-nio--exec-165排号成功,号码是:
http-nio--exec-157排号成功,号码是:
http-nio--exec-168排号失败,号码已经被抢光
http-nio--exec-159排号失败,号码已经被抢光
http-nio--exec-166排号失败,号码已经被抢光
http-nio--exec-163排号失败,号码已经被抢光
http-nio--exec-177排号失败,号码已经被抢光
从上面结果可以看到,20个号挨个被20个线程获取,剩下5个线程将获取不到。说明锁起作用了~
Spring Integration实现分布式锁的更多相关文章
- 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- spring boot redis分布式锁
随着现在分布式架构越来越盛行,在很多场景下需要使用到分布式锁.分布式锁的实现有很多种,比如基于数据库. zookeeper 等,本文主要介绍使用 Redis 做分布式锁的方式,并封装成spring b ...
- 分布式缓存技术redis系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- spring boot redis分布式锁 (转)
一. Redis 分布式锁的实现以及存在的问题 锁是针对某个资源,保证其访问的互斥性,在实际使用当中,这个资源一般是一个字符串.使用 Redis 实现锁,主要是将资源放到 Redis 当中,利用其原子 ...
- Spring Boot (33) 分布式锁
上一篇中使用的Guava Cache,如果在集群中就不可以用了,需要借助Redis.Zookeeper之类的中间件实现分布式锁. 导入依赖 在pom.xml中需要添加的依赖包:stater-web.s ...
- redis系列之5----redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- 使用Redisson实现分布式锁,Spring AOP简化之
源码 Redisson概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多 ...
- spring boot 利用redisson实现redis的分布式锁
原文:http://liaoke0123.iteye.com/blog/2375469 利用redis实现分布式锁,网上搜索的大部分是使用java jedis实现的. redis官方推荐的分布式锁实现 ...
- SpringBoot进阶教程(二十七)整合Redis之分布式锁
在之前的一篇文章(<Java分布式锁,搞懂分布式锁实现看这篇文章就对了>),已经介绍过几种java分布式锁,今天来个Redis分布式锁的demo.redis 现在已经成为系统缓存的必备组件 ...
随机推荐
- 11.5 vmstat:虚拟内存统计
vmstat vmstat是Virtual Memory Statistics(虚拟内存统计)的缩写,利用vmstat命令可以对操作系统的内存信息.进程状态和CPU活动等进行监视.但是只能对系统的整体 ...
- Note | LaTeX
目录 一.TeX家族 1. TeX - LaTeX 2. pdfTeX - pdfLaTeX 3. XeTeX - XeLaTeX 4. CTeX - MiKTeX - TeX Live 二.入门 1 ...
- Java ,python面向对象的继承及其区别
JAVA JAVA继承基本样式 class Demo extends Object{ Demo(int a){ this(); } Demo(){ super(); } } java默认继承Objec ...
- IPC_管道
1.管道特点: 1)单向数据通信 2)匿名管道-常用于(父子进程/有血缘关系的进程之间) 3)命名管道-常用于(无血缘关系进程之间通信) 4)提供一种流式服务(发送和接受不接受字节数的大小,可取任意大 ...
- 【WPF】实现类似QQ聊天消息的界面
最近公司有个项目,是要求实现类似 QQ 聊天这种功能的. 如下图 这没啥难的,稍微复杂的也就表情的解析而已. 表情在传输过程中的实现参考了新浪微博,采用半角中括号代表表情的方式.例如:“abc[dog ...
- H5+.Net Webapi集成微信分享前后端代码 微信JS-SDK wx.onMenuShareTimeline wx.onMenuShareAppMessage
说明: 1/因为赚麻烦这里没有使用数据库或服务器缓存来存储access_token和jsapi_ticket,为了方便这里使用了本地的xml进行持久化这两个值以及这两个值的创建时间和有限期限. 2/每 ...
- maya2014卸载/安装失败/如何彻底卸载清除干净maya2014注册表和文件的方法
maya2014提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2014失败提示maya2014安装未完成,某些产品无法安装,也有时候想重新安装maya ...
- JavaScript实现HTML页面集成QQ空间分享功能
<!DOCTYPE HTML> <html> <head> <title>QQ空间分享</title> <meta http-equi ...
- rabbitmq基础学习+springboot结合rabbitmq实现回调确认confirm
rabbitmq集群docker快速搭建 https://blog.csdn.net/u011058700/article/details/78708767 rabbitmq原理博客 https:// ...
- jmeter获取cookies信息(配置)
jmeter发送请求后,响应信息里获取不到cookies(实际上会返回一个cookies),解决方法: 在jmeter.properties里找到CookieManager.save.cookies, ...