使用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. Asp.netCore 是用的Socket 吗?

    Asp.netCore 是用的Socket 的krestrel 用的是Socket! public static IWebHostBuilder CreateDefaultBuilder(string ...

  2. wstngfw中配置freeradius

    wstngfw中配置freeradius Radius为各种网络设备和服务提供了一个认证来源. Radius认证常用于***.入网门户.交换机.路由器和防火墙.Radius认证比在网络上的不同设备跟踪 ...

  3. vue的data里面的值是数组时,在更改其某一项的时候,怎么触发视图的重新渲染?

    1. 设置对象或数组的值:Vue.set(target,key,value) :2.删除对象或数组中元素: Vue.delete ( target,key) ;3. 数组对象直接修改属性,可以触发视图 ...

  4. MutationObserver

    一.MutationObserver Config childList: 添加.删除目标节点的子节点时会收到通知(子节点的后代节点添加或删除时不会收到通知) attribute: 修改目标节点属性时会 ...

  5. UI5-技术篇-Expand与Deep 服务测试

    1.SEGW创建服务 2.创建Data Model 2.1Entity Types ZRICO_USR 设置主键.排序字段.过滤字段 ZRICO_USRITM设置主键  2.2Associations ...

  6. iOS毛玻璃效果的实现方法

    ios开发中常常用到的毛玻璃效果实现方法 iOS8以后使用系统里的UIBlurEffect可以实现,UIBlurEffect继承自UIVisualEffect UIBlurEffectStyle有三个 ...

  7. MVC-区域(Area)

    1.启用路由前的准备工作 1.Global.asax.cs中注册路由 public class MvcApplication : System.Web.HttpApplication { protec ...

  8. poi 生成word 表格,并向表格单元格中插入多个图片

    接这上一篇,导入数据,也要完整导出来.话不多说,直接上代码. 效果图 //根据实体对象 ,生成XWPFDocument public static XWPFDocument exportDataInf ...

  9. C#-DBHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. Mybatis3.1-[tp_36-37]-_映射文件_select_resultMap关联查询__分步查询传递多列值&fetchType_discriminator鉴别器

    _分步查询传递多列值&fetchType_discriminator鉴别器 笔记要点出错分析与总结 Department.java bean public class Department { ...