ZooKeeper(四) 使用Redis RedissonLock 实现分布式锁
本章将介绍使用RedissonLock 在SpringBoot 工程中实现分布式锁。
项目工程文档目录:
│ pom.xml //maven 依赖文件
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─xiaohui
│ │ │ │ MainApplication.java //springBoot 启动类
│ │ │ ├─bean
│ │ │ │ Stock.java //库存模拟类
│ │ │ ├─cfg
│ │ │ │ RedissonConfig.java //Redisson配置类
│ │ │ └─web
│ │ │ WebController.java //web测试类
│ │ └─resources
│ │ application.properties //项目配置文件
│ └─test
1,pom文件如下:加入了web工程starter和redisson的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xiaohui</groupId><artifactId>zklockdemo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.7.RELEASE</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- redisson 依赖 --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.6.5</version></dependency></dependencies></project>
2,application.properties 主要设置了web工程的访问端口
server.port=8888
3,库存模拟类Stock.java。当库存为0时在进行下单操作则返回false.
package com.xiaohui.bean;public class Stock {//库存当前数量public static int count = 1;/*** 下订单,减少库存操作* @return true 下单成功,false 下单失败*/public static boolean reduceStock(){if(count <= 0){return false;}try {Thread.sleep(400);}catch (Exception e){e.printStackTrace();}count-- ;return true;}
}
4.Redisson配置类 RedissonConfig.java
package com.xiaohui.cfg;import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedissonConfig {@Beanpublic RLock redissonLock(){Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0);RedissonClient client = Redisson.create(config);return client.getLock("redissonLock_name");}
}
5. web测试类
package com.xiaohui.web;import com.xiaohui.bean.ReadisLock;
import com.xiaohui.bean.Stock;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;@RestController
public class WebController {@AutowiredRLock redissonLock;@GetMapping("/startReduce")public String startReduce(){new Thread(new Runnable() {@Overridepublic void run() {redissonLock.lock(15, TimeUnit.SECONDS);boolean b = Stock.reduceStock();System.out.println(Thread.currentThread().getName()+"下单:"+( b ? "成功":"失败"));redissonLock.unlock();}}).start();new Thread(new Runnable() {@Overridepublic void run() {redissonLock.lock(15, TimeUnit.SECONDS);boolean b = Stock.reduceStock();System.out.println(Thread.currentThread().getName()+"下单:"+( b ? "成功":"失败"));redissonLock.unlock();}}).start();new Thread(new Runnable() {@Overridepublic void run() {redissonLock.lock(15, TimeUnit.SECONDS);boolean b = Stock.reduceStock();System.out.println(Thread.currentThread().getName()+"下单:"+( b ? "成功":"失败"));redissonLock.unlock();}}).start();try {Thread.sleep(3000);}catch (Exception e){e.printStackTrace();}System.out.println("Stock.count = " +Stock.count);return "set ok!";}}
6. SpringBoot 启动类
package com.xiaohui;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class,args);}
}
测试:启动后 访问测试地址 http://127.0.0.1:8888/startReduce 控制台打印如下,可以看到只有一个线程下单成功,其他两个下单失败,符合预期效果。
ZooKeeper(四) 使用Redis RedissonLock 实现分布式锁相关推荐
- 17、Redis、Zk分布式锁实现原理
我们在编程有很多场景使用本地锁和分布式锁,但是是否考虑这些锁的原理是什么?本篇讨论下实现分布式锁的常见办法及他们实现原理. 一.使用锁的原则 使用本地锁和分布式锁是为了解决并发导致脏数据的场景,使用锁 ...
- Redlock——Redis集群分布式锁
欢迎关注方志朋的博客,回复"666"获面试宝典 前言 分布式锁是一种非常有用的技术手段.实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 ...
- 【Redis笔记】一起学习Redis | 如何利用Redis实现一个分布式锁?
一起学习Redis | 如何利用Redis实现一个分布式锁? 前提知识 什么是分布式锁? 为什么需要分布式锁? 分布式锁的5要素和三种实现方式 实现分布式锁 思考思考 基础方案 改进方案 保证setn ...
- 阿里JAVA面试题剖析:一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?...
面试原题 一般实现分布式锁都有哪些方式?使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? 面试官心理分析 其实一般问问题,都是这么问的,先 ...
- Redis 集群分布式锁与 API 网关分布式限流
https://www.infoq.cn/article/FoQGIk*BzdQWJJ0tKqrJ Redis 集群的历史 Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twempr ...
- Redis进阶- Redisson分布式锁实现原理及源码解析
文章目录 Pre 用法 Redisson分布式锁实现原理 Redisson分布式锁源码分析 redisson.getLock(lockKey) 的逻辑 redissonLock.lock()的逻辑 r ...
- Redis进阶-细说分布式锁
文章目录 Pre 引 分布式锁演进 V1 分布式锁演进 V2 分布式锁演进 V3 分布式锁演进 V4 分布式锁演进 V5 终极版-分布式锁演进(Redisson ) V6 Code Redisson分 ...
- 基于 Redis 实现的分布式锁
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:我的大学到研究生自学 Java 之路,过程艰辛,不放弃,保持热情,最终发现我是这样拿到大厂 offer 的! 作 ...
- redis系列:分布式锁
1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...
最新文章
- [NC14301]K-th Number
- VMware几个版本的比较
- C# 加载图片image --(C#)Image.FromFile 方法会锁住文件的原因及可能的解决方法
- 根据图片原型写一个html页面,原型图的交互说明该怎么写?
- 多进程与多线程的区别 - jihite
- 漫画 | 程序员离职事件始末
- hashmap 扩容是元素还是数组_HashMap 中的容量与扩容实现
- linux /dev/disk/by-path 修改,Linux磁盘分区
- [高光谱] (6w字巨详细) GitHub开源项目Hyperspectral-Classification的解析
- 联合密度函数求期望_已知(X,Y)的联合概率密度,分别求X,Y的期望、方差
- mysql 触发器 insert new_mysql触发器实例 插入前更新数据
- 科技赋能时代 用ocr身份证识别
- 利用antd进行轻量级表单开发,获取验证码
- 伽罗华有限域_伽罗华域(Galois Field,GF,有限域)乘法运算 | 学步园
- 只需3天即可启动应用发布营销核对清单
- 最常见的开源游戏引擎_拔剑-浆糊的传说_新浪博客
- 增益自适应PI控制器+死区过滤器(Smart PLC向导PID编程应用)
- DP方法(动态规划) 寻找最长公共子序列 LCS问题(c++)
- [Golang]写文件的权限定义perm
- python echo含义_echo什么意思
热门文章
- 推荐一款强大的SQL Internal 查看工具InternalsViewer
- 寻找公共链表起始位置
- idea 使用 Gradle 构建过程中控制台中文显示乱码解决
- component、 filters(过滤器)、computed(计算属性)、$watch(观察属性)、设定计算属性
- Linux Page Cache参数调优在kafka中的应用
- 为什么电脑不能打字_电脑不能打字怎么办?键盘没坏但无法打字的解决方法
- 超详细:Springboot连接centos7下redis6的必要配置和失败分析
- 项目中记录影响性能的缓慢数据库查询
- gvim最简化设置,去掉工具栏和菜单栏
- Objective C的那点小语法