使用redisson做分布式锁

分布式锁

在java中单体应用中,我们如果想要保证一个接口或者服务、方法当下只有一个线程在运行,我们可以通过JDK提供的Lock、Semaphore、同步锁等多种方式实现只有一个线程在运行。

在微服务系统中,我们的单体应用会变成多个节点,只靠JDK本身的锁只能控制一个节点的运行,所以我们需要一个可以控制全局的锁来控制系统的运行,这就是所谓的分布式锁。

Zk redis 等中间件都可以做分布式锁,优缺点也各不相同,在我们现在的系统中zk的直接操作还是比较少,更多的是作为dubbo的服务信息储存,所以用Redis做锁的载体。

Redisson是我国的一位大牛写的一个框架,可以使用 redis做类似JDK的全局队列、锁、集合等N多封装好的东西,同时也是redis官方推荐的框架。官方文档地址:

https://github.com/redisson/redisson/wiki

这个主要是入门。

我们的SpringBoot 版本是 1.5.8  ,首先引入SpringBoot starter的依赖,如下:

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson-spring-boot-starter</artifactId>
   <version>2.15.1</version>
</dependency>

Application.yml 中的Redis配置不需要改变,与spring系统兼容,直接可以在代码中使用redisson的api了。

代码:

@Autowired
RedissonClient redissonClient; @Valid
@ApiOperation(value = "测试接口", notes = "通过接口 ,对测试服务连通性", httpMethod = "POST", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@RequestMapping(value = "test", method = RequestMethod.POST)
public Response<Void> test() {
RLock rLock = redissonClient.getLock("test1");
rLock.lock();
try {
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (log.isDebugEnabled()) {
log.debug("test welcome.........");
}
rLock.unlock();
return Response.success("响应成功");
}

  

我本来使用了最新版的starter但是发现有reactor的东西,造成了启动报错,后来去maven仓库翻了一下,发现2.15.1之后的版本,用的都是2.0以后的springBoot,那2.0之后的用的都是Spring 5的版本,所以往后推,看到2.15.1依然是SpringBoot1.5.X 系列的,

所以使用这个版本,没有报错。

这个版本没有redLock,不过无所谓了,应该没啥问题,没那么大的并发,另外,测试过程中,发现那个tryLock有点儿坑,获取锁的时间,没什么用,后续的代码还是可以执行,执行完成后会报错。我们应该会直接用Lock。

所谓的redLock就是 Redis主节点没有写到从节点的时候,另外一个应用的节点去redis同时查看这个锁是否存在,造成死锁,或者没有保证锁的安全性(题外话,网上有很多资料)

redisson spring boot starter 做分布式锁的更多相关文章

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

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

  2. Spring Boot 2实现分布式锁——这才是实现分布式锁的正确姿势!

    参考资料 网址 Spring Boot 2实现分布式锁--这才是实现分布式锁的正确姿势! http://www.spring4all.com/article/6892

  3. Spring Boot Starter 介绍

    http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...

  4. spring -boot s-tarter 详解

    Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...

  5. 基于 Redis 做分布式锁

    基于 REDIS 的 SETNX().EXPIRE() 方法做分布式锁 setnx() setnx 的含义就是 SET if Not Exists,其主要有两个参数 setnx(key, value) ...

  6. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  7. Spring Boot Starter列表

    转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...

  8. 从零开始开发一个Spring Boot Starter

    一.Spring Boot Starter简介 Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件 ...

  9. 最详细的自定义Spring Boot Starter开发教程

    1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...

随机推荐

  1. ef core2.2 mysql迁移问题

    前段时间,遇到的是ef core mysql迁移的时候,bool类型会自动yingsheweishort的问题,需要手动更正一下今天测试的时候,遇到了MySQL数据表修改后迁移的问题. 问题详情如下  ...

  2. ClickOnce 部署 API 以编程方式检查应用程序更新

    private void InstallUpdateSyncWithInfo() { UpdateCheckInfo info = null; if (ApplicationDeployment.Is ...

  3. SpringBoot启动流程与源码

    一 main方法作为程序的入口,执行SpringApplication.run(),传入参数是启动类的class对象@SpringBootApplication注解 二 run中首先new Sprin ...

  4. BASIS小问题汇总1

    try to start SAP system but failed 2019-04-04 Symptom: when i tried to start SAP system, using the c ...

  5. sql server统计总成绩和排名

    这里的图片可以拖拽到一个新页面查看原图!!!! 这里有两个表,需要查询总成绩和排名 Sql语句: select ST.name,SE.Chinese,SE.Math,SE.English, ( SE. ...

  6. Story of Jerry Wang's Wechat subscription account

    As an SAP Techinical Ambassador,Jerry is always willing to share his SAP expertise to various social ...

  7. JAVA笔记整理(七),JAVA几个关键字

    本篇主要总结JAVA中的super.this.final.static.break.continue 1.super super主要用在继承当中,表示调用父类的构造函数. 1.如果要在子类方法中调用父 ...

  8. Devices Tree加载流程

    DT.IMG布局 hdr zImage Ramdisk.img DT.img 其中DT.img由DTBTOOL打包所有编译生成的dtb生成:布局如下: DT header dt_entry_0 dt_ ...

  9. 理解ld-linux.so.2

    翻译自:Understanding ld-linux.so.2 前言 ld-linux.so.2是linux的动态加载器(dynamic loader).本文试图就ld-linux.so.2如何与Li ...

  10. SpringBoot下,@WebFilter配置获取日志

    CREATE TABLE [dbo].[SWEBSERVICELOG]( [WLG_ID] [varchar](100) NOT NULL, [WLG_SESSIONID] [varchar](100 ...