本章将介绍使用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. [NC14301]K-th Number
  2. VMware几个版本的比较
  3. C# 加载图片image --(C#)Image.FromFile 方法会锁住文件的原因及可能的解决方法
  4. 根据图片原型写一个html页面,原型图的交互说明该怎么写?
  5. 多进程与多线程的区别 - jihite
  6. 漫画 | 程序员离职事件始末
  7. hashmap 扩容是元素还是数组_HashMap 中的容量与扩容实现
  8. linux /dev/disk/by-path 修改,Linux磁盘分区
  9. [高光谱] (6w字巨详细) GitHub开源项目Hyperspectral-Classification的解析
  10. 联合密度函数求期望_已知(X,Y)的联合概率密度,分别求X,Y的期望、方差
  11. mysql 触发器 insert new_mysql触发器实例 插入前更新数据
  12. 科技赋能时代 用ocr身份证识别
  13. 利用antd进行轻量级表单开发,获取验证码
  14. 伽罗华有限域_伽罗华域(Galois Field,GF,有限域)乘法运算 | 学步园
  15. 只需3天即可启动应用发布营销核对清单
  16. 最常见的开源游戏引擎_拔剑-浆糊的传说_新浪博客
  17. 增益自适应PI控制器+死区过滤器(Smart PLC向导PID编程应用)
  18. DP方法(动态规划) 寻找最长公共子序列 LCS问题(c++)
  19. [Golang]写文件的权限定义perm
  20. python echo含义_echo什么意思

热门文章

  1. 推荐一款强大的SQL Internal 查看工具InternalsViewer
  2. 寻找公共链表起始位置
  3. idea 使用 Gradle 构建过程中控制台中文显示乱码解决
  4. component、 filters(过滤器)、computed(计算属性)、$watch(观察属性)、设定计算属性
  5. Linux Page Cache参数调优在kafka中的应用
  6. 为什么电脑不能打字_电脑不能打字怎么办?键盘没坏但无法打字的解决方法
  7. 超详细:Springboot连接centos7下redis6的必要配置和失败分析
  8. 项目中记录影响性能的缓慢数据库查询
  9. gvim最简化设置,去掉工具栏和菜单栏
  10. Objective C的那点小语法