Java提供的内置锁机制只在单机系统里有效,在分布式系统,一般多机部署的环境下无法保证线程安全,这时需要在整个系统提供一个全局唯一的锁。

可以通过Redis,ZooKeeper,数据库实现。

Redis提供了一个分布式锁的开源框架 Redisson,提供持有锁的默认时间,每隔一段时间自动续期,到期自动删除,不会有死锁发生,使用非常方便。

1、maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.4</version>
</dependency>

2、配置文件和Redisson配置类

Redis的单机模式的配置文件和配置类:

redisson.properties配置文件里添加属性:

redisson.addressUrl=redis://127.0.0.1:6379

配置类:

@Configuration
@PropertySource(value = "redisson.properties", encoding = "utf-8")
@ConfigurationProperties(prefix="redisson")
public class RedissonConfig {private String addressUrl;public String getAddressUrl() {return addressUrl;}public void setAddressUrl(String addressUrl) {this.addressUrl = addressUrl;}@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress(addressUrl);return Redisson.create(config);}
}

集群模式配置文件和配置类:

redisson.cluster=peer1:7001,peer1:7002,peer1:7003,peer1:7004,peer1:7005,peer1:7006

配置类:

@Configuration
@PropertySource(value = "redisson.properties", encoding = "utf-8")
@ConfigurationProperties(prefix="redisson")
public class RedissionClusterConfiguration {private  String cluster;public String getCluster() {return cluster;}public void setCluster(String cluster) {this.cluster = cluster;}@Beanpublic RedissonClient redissonClient(){String[] nodes = cluster.split(",");for (int i = 0; i< nodes.length; i++){nodes[i] = "redis://" + nodes[i];}Config config = new Config();config.useClusterServers().setScanInterval(2000).addNodeAddress(nodes);return Redisson.create(config);}
}

3、Redisson 可重入锁的使用,定义一个Service类,接口省略,

import com.example.redission.demo.Service.SellService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;@Slf4j
@Service
public class SellServiceImpl implements SellService {private Long carCount = 500L;@Resourceprivate RedissonClient redissonClient;@Overridepublic void buyCar() {RLock lock = redissonClient.getLock("car");lock.lock();log.info("lock car");if (carCount > 0) {--carCount;log.info("car count " + carCount);} else {log.info("stock is clear");}lock.unlock();log.info("unlock car");}
}
lock.lock() 方法
如果不设定锁定时间,默认30秒,也可以通过Config.lockWatchdogTimeout 指定
如果业务执行时间比较长,超过30秒的1/3,即10s后自动续期为30秒

4、定义一个API接口,

import com.example.redission.demo.Service.SellService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController
public class SellController {@Resourceprivate SellService sellService;@GetMapping("buyCar")public String buyCar() {sellService.buyCar();return "buyCar";}
}

5、测试接口是否成功,

http://localhost:8080/buyCar

6、JMeter压力测试,线程设置如下:

7、查看IDEA 控制台输出

Redisson 实现分布式锁相关推荐

  1. redisson的锁的类型_绝对干货:利用redisson完成分布式锁功能

    在单体架构中,我们使用synchronize或者Lock就能完成上锁同步的操作,但是这些在分布式,微服务的今天,失去了作用. 分布式锁的实现一般有三种解决方案:基于数据库表实现 基于缓存实现,比如re ...

  2. java设计前期工作基础和存在的困难_Java秒杀系统实战系列-基于Redisson的分布式锁优化秒杀逻辑...

    本文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子操作在优化秒 ...

  3. 聊聊redisson的分布式锁

    序 本文主要研究一下redisson的分布式锁 maven <dependency><groupId>org.redisson</groupId><artif ...

  4. 22-09-20 西安 谷粒商城(04)Redisson做分布式锁、布隆过滤器、AOP赋能、自定义注解做缓存管理、秒杀测试

    Redisson 1.Redisson做分布式锁  分布式锁主流的实现方案: 基于数据库实现分布式锁 基于缓存(Redis),性能最高 基于Zookeeper,可靠性最高 Redisson是一个在Re ...

  5. Redisson实现分布式锁原理

    Redisson实现分布式锁原理 一.高效分布式锁 当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件,同时考虑如何高效的设计分布式锁,这里我认为以下几点是必须要考虑的. 1.互斥 ...

  6. Java秒杀系统实战系列~基于Redisson的分布式锁优化秒杀逻辑

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子 ...

  7. Redisson实现分布式锁(3)—项目落地实现

    Redisson实现分布式锁(3)-项目落地实现 有关Redisson实现分布式锁前面写了两篇博客作为该项目落地的铺垫. 1.Redisson实现分布式锁(1)-原理 2.Redisson实现分布式锁 ...

  8. 基于后端开发Redisson实现分布式锁源码分析解读

    一.分布式锁的概念和使用场景 分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问 ...

  9. Redisson 实现分布式锁原理

    Redisson实现分布式锁 有关Redisson作为实现分布式锁,总的分3大模块来讲. 1.Redisson实现分布式锁原理 2.Redisson实现分布式锁的源码解析 3.Redisson实现分布 ...

  10. 再也不用担心面试官让我用Redis实现分布式锁啦(二、Redisson实现分布式锁)

    目录 一.Jedis实现分布式锁 二.Redisson实现分布式锁(单机Redis) 一.引入依赖(3.5.7) 二.配置redis 三.配置RedisonConfig 四.提供锁接口及实现,方便统一 ...

最新文章

  1. 将spark默认日志log4j替换为logback
  2. java class 结构_Java class文件的结构
  3. 编程迷宫_少儿创意编程(特23)scratch之迷宫模式探索(上)
  4. 在VS.NET 的项目中使用生成事件
  5. vscode中文设置不生效_VSCode详细安装教程
  6. [CodeForces-1138B] *Circus 解方程|数学
  7. 软件开发工程师证书有用吗_bim工程师证书有用吗
  8. 【Python】Python3.7.3 - sys.flag 命令行选项标志结构序列
  9. Shell脚本参数值包含空格的处理
  10. Fiddler——模拟限速
  11. 使用Jmeter性能测试注意点
  12. 12. Django基础:模型层及ORM
  13. Unity VSCode + Emmy Lua 插件断点调试Lua脚本
  14. vb.net如何查询电脑麦克风收到声音_拔掉 MacBook,用 8GB 树莓派来办公的体验如何?...
  15. QQ与TIM的不同之处
  16. HTML5学习笔记14-Canvas绘制渐变图形与绘制变形图形
  17. 街霸 隆(Ryu)升龙拳(Syoryuken)动画(四)制作过程中几个版本动画比较一下
  18. 因子分解机FM算法(Factorization Machine)
  19. 网站关键词优化之seo标题写法,快速学会搜索引擎分词技术!
  20. js颜色 RGB 和 16进制转换

热门文章

  1. 【英语学习】【WOTD】grift 释义/词源/示例
  2. struts2漏洞_Apache Struts2057远程代码执行漏洞复现
  3. 可合并堆1:二项堆(Binominal Heap)
  4. C语言中字母转换问题
  5. 傅里叶变换 【完整版】
  6. 推荐一款代码神器,代码量至少省一半! 1
  7. c语言博客作业03-函数
  8. Bzoj1899: [Zjoi2004]Lunch 午餐
  9. oracle创建用户和密码以及授权登录问题
  10. 外媒:ATT宣布加入SD-WAN阵营