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的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...
最新文章
- 序列化和反序列化的几种方式(DataContractSerializer)(二)
- 浅谈网络协议(一) 为什么要学网络协议
- mysql 十八哥_十八哥Mysql笔记之基础篇
- jetbrick-template 1.1.0 发布,支持 #tag, #macro, layout
- python如何进阶提升_Python序列操作之进阶篇
- 12/100. Diameter of Binary Tree
- LVS:三种负载均衡方式比较
- spring版本 jdk8_从JDK8升级到JDK11,看这篇就足够了
- Github 15K! 亿级向量相似度检索库Faiss 原理+应用
- ubuntu14.04下svn版本管理系统的安装及常用命令的使用整理
- php mysql含引号报错,执行sql双引号
- bxp客户端手工PNP基本过程(转)
- 纳韦斯托克斯方程的推导_什么是纳维-斯托克斯方程?
- Dell 2850服务器磁盘阵列数据恢复案例
- Android实现淘宝购物车
- Debian6.02 终端中文设置--FBTerm + ucimf
- 解决Chrome插件安装时程序包无效:CRX_HEADER_INVALID
- opencv学习笔记—— opencv3 源码文件夹内容
- 案例直播 | Pulsar Summit Asia 2022:Day 1 - 分论坛 1:腾讯、华为、有道、vivo、科大讯飞...
- 三国群雄传ol服务器 修改,三国群雄传四大兵营进阶改造攻略详解