springboot配置集成RedisTemplate和Redisson,使用分布式锁案例
文章要点
- 自定义配置属性类
- 集成配置RedisTemplate
- 集成配置分布式锁Redisson
- 使用分布式锁简单实现超卖方案
1. 项目结构

2. 集成RedisTemplate和Redisson
添加依赖
依赖的版本与继承的spring-boot-starter-parent工程相对应,可写可不写
<!--spring data redis & cache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- redis依赖commons-pool 这个依赖一定要添加 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.15.6</version></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency>
大概图解
如上图,先配置application.yml设置Redis的各项属性包括ip,端口,密码。再注入。
server:port: 8080# Redis配置
spring:redis:host: 192.168.200.131port: 6379password: root
// RedisConfigProperties.java
@Data
@ConfigurationProperties(prefix = "spring.redis")
public class RedisConfigProperties {private String host;private int port;private String password;
}// RedisTemplateConfig.java
@Configuration
public class RedisTemplateConfig {@AutowiredRedisConfigProperties redisConfigProperties;@Beanpublic RedisConnectionFactory redisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(redisConfigProperties.getHost(), redisConfigProperties.getPort());config.setPassword(redisConfigProperties.getPassword());return new LettuceConnectionFactory(config);}@Beanpublic RedisTemplate<String, Object> redisTemplate(){RedisTemplate<String,Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory());// 设置序列化器等其他配置return template;}
}// RedissonConfig.java
@Configuration
@EnableConfigurationProperties({RedisConfigProperties.class})
public class RedissonConfig {@AutowiredRedisConfigProperties redisConfigProperties;@Beanpublic RedissonClient redissonClient(){// 1. 创建配置文件Config config = new Config();// 2. 设置单节点服务器配置config.useSingleServer().setAddress("redis://"+redisConfigProperties.getHost()+":"+redisConfigProperties.getPort());// 3. 如果Redis设置了密码,这里需要设置密码config.useSingleServer().setPassword(redisConfigProperties.getPassword());// 4. 创建RedissonClient实例RedissonClient redisson = Redisson.create(config);return redisson;}
}
到这里,RedisTemplate和Redisson就已经集成好了,后续使用只需要注入就行。
例如
@RestController
@RequestMapping(value = "/order")
public class OrderController {@Autowired//private RedisTemplate redisTemplate;private StringRedisTemplate redisTemplate; //通常用这个StringRedisTemplate@Autowiredprivate RedissonClient redissonClient;......
}
3. 模拟分布式场景下超卖现象
OrderController
/**** 抢单*/@GetMapping(value = "/v1/{id}/{num}")public String addv1(@PathVariable(value = "id")String id,@PathVariable("num")Long num) throws InterruptedException {// 1.查询库存int count = Integer.valueOf(redisTemplate.opsForValue().get(id));System.out.println("剩余库存:"+count);// 2.库存充足if (count>=num){//模拟操作TimeUnit.SECONDS.sleep(5);//递减库存Long decrement = redisTemplate.opsForValue().decrement(id, num);System.out.println("递减库存后剩余库存:"+decrement);//其它操作 略System.out.println("----添加订单了!");return "下单成功";}//库存不足else {return "库存不足";}}
复制一个端口为8081的配置,模拟分布式服务

启动两个服务

在Redis中设置一个键值对water:2,模拟水的库存为2.
浏览器同时发送2个请求,模拟有2个用户同时每人买2瓶水
http://127.0.0.1:8080/order/v1/water/2
http://127.0.0.1:8081/order/v1/water/2

出现超卖现象
4. 利用Redisson分布式锁,防止超卖
关键代码
RLock lock = redissonClient.getLock("mylock_" + id); lock.lock(); //自旋获取锁 ... ... lock.unlock();
首先记得set water 2
OrderController
/**** 抢单,使用分布式锁*/@GetMapping(value = "/{id}/{num}")public String add(@PathVariable(value = "id")String id,@PathVariable("num")Long num) throws InterruptedException {//对该商品加锁,加锁成功,则判断库存,避免多人同时判断某一个商品的库存RLock lock = redissonClient.getLock("mylock_" + id);lock.lock(); //自旋获取锁System.out.println("获取了锁!"+lock.getName());try {// 1.查询库存int count = Integer.valueOf(redisTemplate.opsForValue().get(id));System.out.println("剩余库存:"+count);// 2.库存充足if (count>=num){//模拟操作TimeUnit.SECONDS.sleep(5);//递减库存Long decrement = redisTemplate.opsForValue().decrement(id, num);System.out.println("递减库存后剩余库存:"+decrement);//其它操作 略System.out.println("----添加订单了!");return "下单成功";}//库存不足else {return "库存不足";}} finally {//释放锁System.out.println("释放了锁!"+lock.getName());lock.unlock();}}
启动2个服务,浏览器同时发送2个请求
http://127.0.0.1:8080/order/water/2
http://127.0.0.1:8081/order/water/2

防止了超卖现象
相关文章:
springboot配置集成RedisTemplate和Redisson,使用分布式锁案例
文章要点 自定义配置属性类集成配置RedisTemplate集成配置分布式锁Redisson使用分布式锁简单实现超卖方案 1. 项目结构 2. 集成RedisTemplate和Redisson 添加依赖 依赖的版本与继承的spring-boot-starter-parent工程相对应,可写可不写 <!--spring data redis…...
随机数相关
产生随机数对象 固定写法: Random 随机数变量名 new Random();Random r new Random();生成随机数 int i r.Next(); //生成一个非负数的随机数 Console.WriteLine(i);i r.Next(100); // 生成一个 0~99的随机数 左边始终是0 左包含 右边是100 右不包含 Consol…...
EulerMaker Yocto Open Build Service
EulerMaker & Yocto & Open Build Service 1 介绍1.1 概述 2 工具2.1 Yocto 【嵌入式领域】介绍目标好处三大关键组件创建流程发行版本 2.2 Open Build Service 【OBS】【服务器领域】介绍应用 2.3 EulerMaker 【全场景】介绍特性需求背景(1)能支…...
SQL面试问题集
目录 Q.左连接和右连接的区别 Q.union 和 union all的区别 1、取结果的交集 2、获取结果后的操作 Q.熟悉开窗函数吗?讲一下row_number和dense_rank的区别。 Q.hive行转列怎么操作的 Q.要求手写的题主要考了聚合函数和窗口函数,row_number()&#…...
基于单片机的八路抢答器设计论文
绪 论1.1 课题研究的相关背景 抢答器是一种应用非常广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。早期的抢答器只由几个三极管、可控硅、发光管等组成,能通过发光管的指示辩认出选手号码。现在大多数抢答器均使用单片机(如MCS-5…...
一个最简单基于spring的websocket服务端+客户端实现案例
1、服务端 代码分为两部分: 一个是服务器终端类:用java注解来监听连接ServerEndpoint、连接成功OnOpen、连接失败OnClose、收到消息等状态OnMessage import org.springframework.stereotype.Component;import javax.websocket.*; import javax.websoc…...
三.二、关于 Vue.js 中`transition`组件使用:页面切换动画和标签移动动画都是要用到的
一、引言 在 Vue.js 中,transition组件提供了一种简单而强大的方式来实现页面过渡效果。它可以让元素在状态改变时,如进入或离开视图时,以平滑的动画方式进行过渡。通过transition,我们可以为应用增添更加生动和吸引人的用户体验…...
指纹考勤系统
目录 1.课题研究目的和内容 1.1 课题研究目的 1.2 课题研究内容 2.系统总体方案设计及功能模块介绍 2.1总体方案设计 2.2 ATK-301模块介绍 2.3 TFTLCD显示功能模块介绍 2.4 蜂鸣器报警功能模块介绍 2.5 时钟模块介绍 3.系统硬件设计与实现 3.1 系统硬件电…...
怎么找抖音视频素材?下载抖音的素材视频网站分享给你
在这个视觉印象至关重要的时代,选用高质量的视频素材对于制作抖音视频来说是关键。如果你正在寻找适合的视频素材来丰富你的抖音创作,以下这份详细的视频素材网站指南将帮助你迈出第一步。 蛙学府网 蛙学府网提供了丰富多样的视频素材,包括动…...
【pytorch】大模型训练张量并行
Large Scale Transformer model training with Tensor Parallel (TP) 张量并行如何工作 原始 Tensor Parallel (TP) 模型并行技术于Megatron-LM论文中被提出,是一种用于培育大规模Transformer模型的高效模型并行技术。我们在本练习指南中介绍的序列并行 (SP) 实际…...
Flutter 中的 CupertinoSliverNavigationBar 小部件:全面指南
Flutter 中的 CupertinoSliverNavigationBar 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中,CupertinoSliverNavigation…...
【数据库系统概论】程序题
“学生管理数据库”包含以下三个表,即学生表Student、课程表Course和选课表SC,结构如下: Student(Sno,Sname,Ssex,Sage,Sdept)Course (Cno,Cname&…...
群体优化算法---蝙蝠优化算法分类Iris数据集
介绍 蝙蝠算法(Bat Algorithm, BA)是一种基于蝙蝠回声定位行为的优化算法。要将蝙蝠算法应用于分类问题,可以通过将蝙蝠算法用于优化分类器的参数,图像分割等 本文示例 我们使用一个经典的分类数据集,如Iris数据集&…...
【C++】类和对象1.0
本鼠浅浅介绍一些C类和对象的知识,希望能得到读者老爷们的垂阅! 目录 1.面向过程和面向对象 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1.类的访问限定符 4.2.封装 5.C中struct和class的区别 6.类域 7.类的实例化 8.类对象模型 8.1.类…...
Linux下gcc编译32位程序报错
gcc使用-m32选项,编译32位程序时,报错:/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory gcc编译32位程序时,报错:/usr/include/stdio.h:27:10: fatal error: bits/li…...
godot.bk
1.搜索godot国内镜像,直接安装,mono是csharp版本 2.直接解压,50m,无需安装,直接运行 3.godot里分为场景,节点 主场景用control场景,下面挂textureact放背景图片,右键实例化子场景把…...
【C++修行之道】类和对象(三)拷贝构造函数
目录 一、 概念 二、特征 正确的拷贝构造函数写法: 拷贝函数的另一种写法 三、若未显式定义,编译器会生成默认的拷贝构造函数。 四、编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗? 深拷…...
校园外卖系统的技术架构与实现方案
随着校园生活的日益现代化,外卖需求在高校学生群体中迅速增长。为了满足这一需求,校园外卖系统应运而生。本文将详细探讨校园外卖系统的技术架构及其实现方案,帮助读者了解这一系统的核心技术与实现路径。 一、系统概述 校园外卖系统主要包…...
AI的制作思维导图
AI(人工智能)的实现通常涉及以下几个步骤: 1.问题定义:首先确定你想要解决的问题是什么,这将决定你需要设计什么样的系统。 2.数据收集:根据你的需求,收集相关的数据集来训练你的AI模型。数据的…...
Amazon云计算AWS(四)
目录 八、其他Amazon云计算服务(一)快速应用部署Elastic Beanstalk和服务模板CloudFormation(二)DNS服务Router 53(三)虚拟私有云VPC(四)简单通知服务和简单邮件服务(五&…...
微信小程序使用websocket调用大模型返回逐字显示的结果
页面展示:小程序代码: aichat.js:const config require(../../utils/config.js); Page({data: {messages: [],inputText: ,isLoading: false,scrollToId: scroll-bottom,currentStreamingId: null,isConnecting: false,isReceiving: false,socketOpen: …...
ComfyUI-VideoHelperSuite视频工作流技术指南:从基础操作到专业应用
ComfyUI-VideoHelperSuite视频工作流技术指南:从基础操作到专业应用 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 引言:视频处理工作流的…...
无需寻找激活码,用快马平台五分钟搭建你的第一个Web项目管理面板原型
最近在折腾一个Web项目管理面板的原型设计,发现用传统方式从零搭建实在太费时间。刚好试用了InsCode(快马)平台,五分钟就搞定了基础功能,完全不需要操心本地环境配置或者找什么激活码。记录下这个超快手的实现过程: 功能拆解 这个…...
为什么99%的视频系统都是假的?——没有空间数据的视频,只是一个会动的PPT
一、开头:你看到的“监控”,其实什么都没看见你有没有这种感觉:城市里到处都是摄像头 监控系统越来越多 画面越来越清晰(甚至4K、8K)但一旦真的发生事情:👉 找不到人 👉 跟不上路径 …...
幻兽帕鲁存档修复终极指南:告别数据丢失的完整解决方案
幻兽帕鲁存档修复终极指南:告别数据丢失的完整解决方案 【免费下载链接】palworld-host-save-fix Fixes the bug which forces a player to create a new character when they already have a save. Useful for migrating maps from co-op to dedicated servers and…...
Qwen3.5-9B基础教程:start.sh脚本解析+环境变量注入+PATH调试技巧
Qwen3.5-9B基础教程:start.sh脚本解析环境变量注入PATH调试技巧 1. 项目概述 Qwen3.5-9B是一个拥有90亿参数的开源大语言模型,具备强大的逻辑推理、代码生成和多轮对话能力。该模型支持多模态理解(图文输入)和长上下文处理&…...
BilibiliDown:三步实现B站音频高效提取与批量处理全攻略
BilibiliDown:三步实现B站音频高效提取与批量处理全攻略 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors…...
数字记忆争夺战:WechatDecrypt本地解密技术实现与场景化应用指南
数字记忆争夺战:WechatDecrypt本地解密技术实现与场景化应用指南 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 问题溯源:当数字记忆遭遇加密牢笼 从一则数据丢失案例说起 张先…...
【深度评测】C盘爆满别慌!小番茄C盘清理的五大核心功能实测
1. 为什么你的C盘总是爆满? 每次打开电脑看到C盘飘红,是不是感觉血压都上来了?作为一个常年和磁盘空间斗智斗勇的老司机,我发现C盘爆满的原因远比想象中复杂。系统更新残留、软件缓存堆积、临时文件泛滥...这些"隐形杀手&quo…...
Youtu-VL-4B-Instruct惊艳效果展示:同一张图连续追问‘文字内容→主色调→人物数量→情绪判断’
Youtu-VL-4B-Instruct惊艳效果展示:同一张图连续追问‘文字内容→主色调→人物数量→情绪判断’ 你有没有想过,如果给AI一张图片,它能像人一样“看懂”并回答你一连串的问题吗?比如,先问它图片里写了什么字࿰…...
