首页 > 数据库 >记录使用Redis当分布式锁

记录使用Redis当分布式锁

时间:2024-01-22 14:56:13浏览次数:37  
标签:info currentThread Thread 记录 Redis redis log device 分布式

在网上看到一次使用redis当分布式锁的文章,我就自己写了个demo

前置条件:建议新建一个springboot工程(添加web依赖),然后自行整合mybatisplus、redis,可以参照以下链接:

mybatisPlus:https://blog.csdn.net/wang20000102/article/details/132615071

redis:https://blog.csdn.net/lwj_07/article/details/126265935。就只需要引入依赖和添加redis配置

 核心代码如下:

controller层

 service

 serviceImpl

@Override
@Transactional
public void testConcurrent() {
//使用redis实现分布式锁setnx
String CHANGE_DEMO = "change_demo";
Boolean flag = redisTemplate.opsForValue().setIfAbsent(CHANGE_DEMO, Thread.currentThread().getId(), 5, TimeUnit.SECONDS);
//如果拿到了锁,执行业务逻辑
if (flag) {
try {
log.info("线程{}拿到锁,开始执行业务逻辑",Thread.currentThread().getId());
Device device = deviceMapper.selectById(3);
//锁过期时间是5秒 这里我让线程休眠5s 那键值肯定就是过期了 看看有什么问题
//Thread.sleep(6000);
if (device.getSortNum() > 0) {
log.info("当前库存是:{}", device.getSortNum());
int i = device.getSortNum() - 1;
device.setSortNum(i);
Integer integer = deviceMapper.updateById(device);
Device select = deviceMapper.selectById(3);
log.info("线程{}抢到商品,当前减后库存是:{}", Thread.currentThread().getId(), select.getSortNum());
}
}catch (Exception e){
log.info("扣除库存中出现异常",e);
}finally {
//谁加锁 谁解锁
if (Objects.equals(redisTemplate.opsForValue().get(CHANGE_DEMO),Thread.currentThread().getId())){
redisTemplate.delete(CHANGE_DEMO);
log.info("线程{}解锁成功",Thread.currentThread().getId());
}
}
}
}
配置文件application.yaml

 数据库表:

 

参照如下链接:https://blog.csdn.net/weixin_44130574/article/details/125678000

注:不是抄袭,我只是把代码自行实现下,我觉得作者写的很好。如有侵权,联系我删除文章。

 

标签:info,currentThread,Thread,记录,Redis,redis,log,device,分布式
From: https://www.cnblogs.com/qwg-/p/17979992

相关文章

  • 毕设全流程记录(个人向)
    选定java语言参考1:Java快速入门:https://www.cnblogs.com/happyframework/p/3332243.htmlJava后台开发的常用框架有SSM框架。选定SSM框架参考1:SSM框架理解:https://www.cnblogs.com/verlen11/p/5349747.html 参考2:使用idea2017搭建SSM框架:https://www.cnblogs.com/hackyo/p/66......
  • python redis示例
    Redis是一个基于内存的高性能键值对(key-value)存储系统,同时也支持丰富的数据结构,如字符串、哈希表、列表、集合、有序集合等。在Python中,我们通常使用redis-py这个第三方库来连接和操作Redis。以下是一个基本的使用步骤以及各种数据结构操作的示例:1.安装redis-py库pipinstall......
  • redis 安装教程
    一、初始化环境创建redis运行时的用户和组$groupaddredis$useradd-gredisredis-s/sbin/nologin-M初始化数据目录$rm-rf/data/redis$mkdir-pv/data/redis$chown-Rredis:redis/data/redis初始化日志目录$mkdir-pv/data/logs/redis$chown-Rredis:redis/......
  • 面试官:Redis持久化能关吗?怎么关?
    数据持久化是指将数据从内存中,保存到磁盘或其他持久存储介质的过程,这样做的目的是为了保证数据不丢失。而Redis的持久化功能默认是开启的,这样做的目的也是为了保证程序的稳定性(防止缓存雪崩、缓存击穿等问题)和数据不丢失。Redis持久化能关吗?怎么关?Redis持久化默认是开启的,......
  • Ray一个通用分布式计算框架基本使用
      Ray一个开源的通用分布式计算框架,支持传统的并行任务并支持AI模型的分布式训练,分布式任务包括有状态与无状态任务,Ray能够快速的构建分布式系统,支持按需申请CPU或GPU;Ray提供了统一的接口提供了基于任务的并行计算与基于行动器的计算,前者通常用于无状态的任务后者用于有状态的任......
  • DC-7靶机做题记录
    靶机下载地址:链接:https://pan.baidu.com/s/1w2c_QKd_hOoR2AzNrdZjMg?pwd=tdky提取码:tdky参考:DC7靶机地址:http://www.five86.com/downloads/DC-7.zipDC7靶场介绍:https://www.vulnhub.com/entry/dc-7,356/php插件地址:https://ftp.drupal.org/files/projects/php-8.x-1.x......
  • 文心一言测评记录
    首先,我们需要明确RB-INSERT和RB-DELETE的基本操作。RB-INSERT的基本步骤如下:将新节点插入到红黑树的某个位置。重新平衡树,确保红黑树的性质仍然满足。RB-DELETE的基本步骤如下:http://sss.com。重新平衡树,确保红黑树的性质仍然满足。现在,我们考虑一个特定的场景:首先使用RB......
  • django使用redis集群、连接池、MySQL连接池
    redis的相关设置CACHES={"default":{"BACKEND":"django_redis.cache.RedisCache","LOCATION":["redis://127.0.0.1:6379/1","redis://127.0.0.1:6380/1",#...],"OPTIONS":{"CLIENT_......
  • 阿里云 ACK 云原生 AI 套件中的分布式弹性训练实践
    作者:霍智鑫众所周知,随着时间的推移,算力成为了AI行业演进一个不可或缺的因素。在数据量日益庞大、模型体量不断增加的今天,企业对分布式算力和模型训练效率的需求成为了首要的任务。如何更好的、更高效率的以及更具性价比的利用算力,使用更低的成本来训练不断的迭代AI模型,变成了迫......
  • 假期学习记录07
    本次学习了Spark概述,了解了Spark的一些基本概念,为更好的学习基于内存计算的分布式框架,拥有良好的性能,运行速度快,采用内存计算scala简介运行再jvm上,具有强大并发性,支持函数式编程,语法简洁,兼容java,交互式语言Spark与Hadoop比较Hadoop:磁盘io开销大,表达能力有限,延迟高,map......