本章将介绍使用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 实现分布式锁相关推荐

  1. 17、Redis、Zk分布式锁实现原理

    我们在编程有很多场景使用本地锁和分布式锁,但是是否考虑这些锁的原理是什么?本篇讨论下实现分布式锁的常见办法及他们实现原理. 一.使用锁的原则 使用本地锁和分布式锁是为了解决并发导致脏数据的场景,使用锁 ...

  2. Redlock——Redis集群分布式锁

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 分布式锁是一种非常有用的技术手段.实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 ...

  3. 【Redis笔记】一起学习Redis | 如何利用Redis实现一个分布式锁?

    一起学习Redis | 如何利用Redis实现一个分布式锁? 前提知识 什么是分布式锁? 为什么需要分布式锁? 分布式锁的5要素和三种实现方式 实现分布式锁 思考思考 基础方案 改进方案 保证setn ...

  4. 阿里JAVA面试题剖析:一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?...

    面试原题 一般实现分布式锁都有哪些方式?使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? 面试官心理分析 其实一般问问题,都是这么问的,先 ...

  5. Redis 集群分布式锁与 API 网关分布式限流

    https://www.infoq.cn/article/FoQGIk*BzdQWJJ0tKqrJ Redis 集群的历史 Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twempr ...

  6. Redis进阶- Redisson分布式锁实现原理及源码解析

    文章目录 Pre 用法 Redisson分布式锁实现原理 Redisson分布式锁源码分析 redisson.getLock(lockKey) 的逻辑 redissonLock.lock()的逻辑 r ...

  7. Redis进阶-细说分布式锁

    文章目录 Pre 引 分布式锁演进 V1 分布式锁演进 V2 分布式锁演进 V3 分布式锁演进 V4 分布式锁演进 V5 终极版-分布式锁演进(Redisson ) V6 Code Redisson分 ...

  8. 基于 Redis 实现的分布式锁

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:我的大学到研究生自学 Java 之路,过程艰辛,不放弃,保持热情,最终发现我是这样拿到大厂 offer 的! 作 ...

  9. redis系列:分布式锁

    1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...

最新文章

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

热门文章

  1. Memo History Tracking History in Access 2007
  2. 顺序存储二叉树之寻找公共祖先节点
  3. Notepad++快速选中多行
  4. linux安装两个jdk_jdk在linux上安装过程
  5. ASP.NET WebForm echarts初试随笔
  6. 北京理工大学计算机课答案,北京理工大学计算机专业考研课程模拟试题.doc
  7. Mysql执行计划的extra列及filesort祥析
  8. 【ELK】ELK安装与配置
  9. Spring核心系列之ApplicationContext
  10. 基于canvas的视频遮罩插件