[001-03-007].第26节:分布式锁迭代1->基于setnx命令实现分布式锁:

embedded/2024/12/23 5:42:41/

我的博客大纲

我的后端学习大纲


1、setnx命令:


2、逻辑梳理:

  • 1.借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同时有多个客户端发送setnx命令,只有一个客户端可以成功,返回1(true);其他的客户端返回0(false)。
    在这里插入图片描述
    1.多个客户端同时获取锁(setnx)
    2.获取成功,执行业务逻辑,执行完成释放锁(del)
    3.其他客户端等待重试

3、编码实现:

  • 1.改造StockService方法:
@Service
public class StockService {@Autowiredprivate StringRedisTemplate redisTemplate;public void deduct() {// 加锁setnxBoolean lock = this.redisTemplate.opsForValue().setIfAbsent("lock", "111");// 如果没有抢到锁,那么就进行重试:实现递归调用if (!lock){try {Thread.sleep(50);this.deduct();} catch (InterruptedException e) {e.printStackTrace();}} else {try {// 1. 查询库存信息String stock = redisTemplate.opsForValue().get("stock").toString();// 2. 判断库存是否充足if (stock != null && stock.length() != 0) {Integer st = Integer.valueOf(stock);if (st > 0) {// 3.扣减库存redisTemplate.opsForValue().set("stock", String.valueOf(--st));}}} finally {// 解锁this.redisTemplate.delete("lock");}}}
}
  • 2.其中,加锁也可以使用循环:
// 加锁,获取锁失败重试
while (!this.redisTemplate.opsForValue().setIfAbsent("lock", "111")){try {Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}
}
  • 3.解锁:
// 释放锁
this.redisTemplate.delete("lock");

4、使用Jmeter压力测试

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/embedded/111164.html

相关文章

C++多态

多态的概念: 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。编译时多态(静态多态)主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的函数…

SprinBoot+Vue校园车辆管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

揭秘自闭症学校:探索星贝育园独特教育模式的魅力

在教育的广阔天地里,有一群孩子以他们独特的方式感知世界,他们便是自闭症儿童。为了这些特殊的孩子,广州市星贝育园康复中心应运而生,它不仅是一所康复训练机构,更是一个充满爱与智慧的乐园,以其独特的教育…

数字孪生之-3D可视化

定义: 广义:一切现实物体的虚拟化表达,都可以算是广义的数字孪生行业:数字孪生体应该是与现实物体一对一映射、实时数据连接、有数据模型和对应的数据的 个人理解数字孪生的实现还是基于数据驱动,加上上帝视角&#xf…

Oracle Linux 8.10安装Oracle19c(19.3.0)完整教程

安装前请仔细将文档通读一遍,安装过程中根据安装命令仔细核对,特别留意一些字体加粗或标红的字样,遇到问题请及时咨询博主 1、基础环境 1.1、操作系统 cat /etc/redhat-release 1.2、主机名 医院默认分配的主机名可能跟其他主机会有重复&a…

软考架构-架构风格

一、概念: 风格就是架构的模式,比如C/S、B/S架构,比如现实生活中的中式风格、欧式风格 描述某一特定应用领域中系统组织的方式 软件架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织…

前端 Vue3 项目开发—— ESLint prettier 配置代码风格

ESLint & prettier 介绍 如果你用的是 pnpm create vue 来创建项目,那么创建项目时就会让你选择是否添加 ESLint 和 prettier 我们在上一篇博客中详细介绍过 ESLint,可以说上一篇博客是这篇博客的先修知识,所以各位小伙伴们请先去看看我…

省市县相关校验sql随笔

1.层级校验 要判断一个给定的省、市、区(县)名字是否符合正确的层级关系,假设你的表结构如下: CREATE TABLE regions (id INT PRIMARY KEY,name VARCHAR(255),parent_id INT, -- 指向上一级区域的id,例如市的parent_id指向省的…