Spring Boot + Redisson 封装分布式锁
目标:一行代码调用,简单粗暴。
基操:自动加锁,自动解锁,自动处理异常,自动处理锁超时等。
安装
redis + redisson
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.39.0</version></dependency>
hutool 工具类
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>
配置
spring:data:redis:host: xxxport: 6379password: xxxdatabase: x
配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;/*** 方便获取 Spring IOC 实例** @author jason*/
@Configuration
@Import(cn.hutool.extra.spring.SpringUtil.class)
public class BeanConf {
}
工具类
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;/*** Redisson 操作工具类** @author jason*/
@Slf4j
@Component
public class RedissonUtil {/*** 锁默认超时时间为(单位:秒)*/private static final long LEASE_TIME = 10;@Autowiredprivate RedissonClient redissonClient;public static RedissonUtil instance() {return SpringUtil.getBean(RedissonUtil.class);}/*** 获取可重入锁* <p>* 读写锁(RReadWriteLock)包括读锁和写锁两部分:* 读锁(Read Lock):允许多个读线程同时访问,但写线程会被阻塞。* 写锁(Write Lock):独占锁,保证同时只有一个写线程访问,同时也会阻塞其他读线程。*/public static RLock getClint(String key) {return instance().redissonClient.getLock(key);}/*** 加锁*/public static void lock(String key) {getClint(key).lock(LEASE_TIME, TimeUnit.SECONDS);}/*** 解锁*/public static void unLock(String key) {if (getClint(key).isLocked()) {getClint(key).unlock();}}/*** 分布式锁,默认超时时间为 LEASE_TIME*/public static <T> T lock(String lockKey, Supplier<T> supplier) {lockKey = "distributed:" + lockKey;log.info("加锁开始,线程:{}", ThreadUtil.currentThreadGroup().getName());RedissonUtil.lock(lockKey);log.info("加锁结束,线程:{}", ThreadUtil.currentThreadGroup().getName());try {log.info("执行代码块开始,线程:{}", ThreadUtil.currentThreadGroup().getName());T t = supplier.get();log.info("执行代码块结束,线程:{}", ThreadUtil.currentThreadGroup().getName());return t;} catch (Exception e) {log.error(StrUtil.format("执行异常,线程:{}", ThreadUtil.currentThreadGroup().getName()), e);} finally {RedissonUtil.unLock(lockKey);log.info("释放锁结束,线程:{}", ThreadUtil.currentThreadGroup().getName());}return null;}}
测试
@GetMapping("/lock/{key}")public String lock(@PathVariable String key) {return RedissonUtil.lock(key, () -> {ThreadUtil.sleep(30 * 1000);return "出参";});}
2024-12-26T11:07:41.307 xxx.util.RedissonUtil : 加锁开始,线程:main
2024-12-26T11:07:41.315 xxx.util.RedissonUtil : 加锁结束,线程:main
2024-12-26T11:07:41.315 xxx.util.RedissonUtil : 执行代码块开始,线程:main
2024-12-26T11:08:11.323 xxx.util.RedissonUtil : 执行代码块结束,线程:main
2024-12-26T11:08:11.338 xxx.util.RedissonUtil : 释放锁结束,线程:main
源码
https://gitee.com/zhaomingjian/workspace_jason_demo/tree/master/spring-boot-seckill
相关文章:
Spring Boot + Redisson 封装分布式锁
目标:一行代码调用,简单粗暴。 基操:自动加锁,自动解锁,自动处理异常,自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…...
从零开发一套UWB定位系统需要多长时间?UWB超宽带定位系统源码
从零开发一套UWB定位系统需要多长时间? 从零开发一套UWB定位系统所需的时间会受到多种因素的影响,以下是详细分析: 一、系统复杂度 1、基本功能定位系统 如果只是开发一个简单的UWB定位系统,仅实现基本的定位功能,如在…...
DataCap 2024.4.1 版本发布:MongoDB 驱动支持、工作流引擎升级
尊敬的 DataCap 用户: DataCap 2024.4.1 版本现已正式发布。本次更新包含多项重要功能升级和性能优化,现将主要更新内容公布如下: 核心功能升级 数据库功能增强 (实现功能) 新增数据库管理功能:支持创建、删除和切换数据库完善表…...
常见端口(22、25、53、80、443、110、143、3306、6379、21)和服务的安装与配置手册
文章目录 一、系统初始设置1. 系统与工具的基础配置1.1 系统更新1.2 网络连接测试1.3 工具安装 2. 防火墙配置2.1 启用防火墙服务2.2 检查默认规则2.3 开放常用端口2.4 查看已开放端口 二、常见端口及其用途1. 端口 22(SSH)2. 端口 25(SMTP&a…...
使用maven-mvnd替换maven大大提升编译打包速度
先上结论!!! 多模块清理并打包提升:约3.5倍 多模块不清理打包提升:约5.5倍 单模块提升:约2倍 从计算结果来看,多模块提升的效率更高。在使用mvnd package打包多模块式,可在控制台…...
图像去雾 | 基于Matlab的图像去雾系统(四种方法)
图像去雾 | 基于Matlab的图像去雾系统(四种方法) 目录 图像去雾 | 基于Matlab的图像去雾系统(四种方法)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于Matlab的图像去雾系统(四种方法) 关于图像…...
【Ubuntu 系统 之 开启远程桌面SSH登录】
【Ubuntu 系统 之 开启远程桌面&SSH登录】 一、开启 SSH 登录二、开启远程桌面1、更新包管理器并安装 xrdp1.1、遇到错误1.2、解决方法 2、安装桌面环境(如果服务器上没有 GUI)3、配置 xrdp 使用默认的 GNOME 桌面环境4、配置防火墙允许远程桌面连接…...
利用 AI 生成 XMind 思维导图教程
本文将介绍如何使用 AI 工具(如 ChatGPT 等),从无到有生成层次分明、可直接导入到 XMind 的 Markdown 格式思维导图。主要步骤包括:选择主题、编写并润色 Markdown 文档、在 XMind 中进行导入与可视化。 一、为什么使用 AI XMind…...
电子应用设计方案81:智能AI冲奶瓶系统设计
智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务,特别是在夜间或忙碌时,减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例,满足不同年龄段婴…...
MySQL的索引
没有索引会怎么样 数据库中的数据最终是存储在磁盘上的。 mysql服务器,本质上是内存进程,CURD操作全都是在内存中进行的—索引也是如此。 所以,需要将数据从磁盘读进内存,才能进行操作。 如果没有索引,表中的数据会向…...
Pytest 高级用法:间接参数化
文章目录 1. 引言2. 基础概念2.1 Fixture2.2 参数化 3. 代码实例3.1 基础设置3.2 测试用例示例示例 1:基础的间接参数化示例 2:通过 request 获取参数值示例 3:多参数组合测试示例 4:部分间接参数化 4. 最佳实践5. 总结参考资料 1…...
基于视觉语言模型(VLM)的CogAgent
前言 CogAgent 是由清华大学与智谱AI联合推出的一个多模态大模型,专注于图形用户界面(GUI)的理解和导航。它代表了在视觉语言模型(VLM)领域的一项重要进展,特别是在GUI Agent能力方面。相较于传统的基于文…...
文件传输工具FTransferor<优化篇>
在上一篇文章中,我们详细探讨了FTransferor文件传输工具的设计与实现,并展示了它在局域网文件传输方面的高效性。然而,随着互联网应用场景的不断丰富,传统的基于 TCP/UDP 的传输方式已经无法满足部分开发者的需求。特别是在跨平台…...
【Linux】Centos7下载npm
Index of /dist/v16.20.2/ (nodejs.org) 下载 wget https://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.gz解压 sudo tar -zxvf node-v16.20.2-linux-x64.tar.gz 配置环境变量 sudo vim /etc/profile export NODE_HOME/usr/local/node-v16.20.2-linux-x64 ex…...
Spring boot + Hibernate + MySQL实现用户管理示例
安装MySQL Windows 11 Mysql 安装及常用命令_windows11 mysql-CSDN博客 整体目录 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLS…...
Neo4j GDS 2.0 安装与配置
Neo4j GDS 2.0 安装与配置 GDS插件安装:Neo4j官方文档 1. GDS简介 Neo4j Graph Data Science (GDS) 库作为 Neo4j Graph Database 的插件提供。该插件需要安装到数据库中并在 Neo4j 配置中列入白名单。有两种主要方法可以实现这一点,我们将在本章中详…...
【非关系型数据库Redis 】 入门
Redis入门 一、非关系型数据库概述 (一)概念 非关系型数据库(NoSQL,Not Only SQL)是相对于传统的关系型数据库而言的一种数据存储管理系统。它摒弃了关系型数据库中严格的表结构、SQL 语言操作以及复杂的事务等特性…...
【Linux报告】实训一:GNME桌面环境的设置及应用
实训一:GNME桌面环境的设置及应用 【练习1】在图形模式和文本模式下登录Linux系统。 1、开启Linux虚拟机。 答:打开此虚拟机如图所示 2、观察屏幕上显示的启动信息。 3、当系统启动到图形界面时,用普通用户身份登录。 答:如图…...
mysql8 从C++源码角度看 客户端发送的sql信息 mysql服务端从网络读取到buff缓存中
MySQL 8 版本中的客户端-服务器通信相关,特别是在接收和解析网络请求的数据包时。以下是对代码各个部分的详细解释,帮助您更好地理解这些代码的作用。 代码概述 这段代码主要负责从网络读取数据包,它包含了多个函数来处理网络数据的读取、缓…...
log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件
文章目录 一、DefaultRolloverStrategy1.1、DefaultRolloverStrategy节点1.1.1、filePattern属性1.1.2、DefaultRolloverStrategy删除原理 1.2、Delete节点1.2.1、maxDepth属性 二、知识扩展2.1、DefaultRolloverStrategy与Delete会冲突吗?2.1.1、场景一:…...
macos 支持外接高分辩率显示器开源控制软件
macos 支持外接高分辩率显示器开源控制软件 软件(app应用)名:BetterDisplay 官方地址: https://github.com/waydabber/BetterDisplay...
HTML5实现好看的喜庆圣诞节网站源码
HTML5实现好看的喜庆圣诞节网站源码 前言一、设计来源1.1 主界面1.2 圣诞介绍界面1.3 圣诞象征界面1.4 圣诞活动界面1.5 圣诞热度界面1.6 圣诞纪念界面1.7 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的喜庆圣诞节网站源码,圣…...
鸿蒙 NEXT 开发中,使用公共事件进行进程间通信
大家好,我是 V 哥,在鸿蒙 NEXT 开发中,使用公共事件进行进程间通信(IPC)是一种常见的做法。下面我将提供一个完整的业务代码示例,并解释逻辑关系,以便即使是初学者也能按照步骤进行实操…...
算法-excel表头位置转成对应数字 26进制转10进制
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: columnTitle "A" 输出: 1示例 2: 输入: colu…...
清华发布Hyper-YOLO:超图计算+目标检测!捕捉高阶视觉关联
目录 论文信息 引言 背景 算法概括 超图计算 Hyper-YOLO整体架构 基于超图的跨层次和跨位置表示网络 Coovally AI模型训练与应用平台 实验结论 总结 论文信息 题目:Hyper-YOLO: When Visual Object Detection Meets Hypergraph Computation Hyper-YOLO&a…...
如何使用网络工具进行网络性能评估
网络评估是对IT基础设施的系统评估,以确保它能够很好地满足企业的核心运营需求,确定了基础设施中需要改进的领域,并定义了改进的范围。 网络评估工具分析IT基础设施的各个方面,它通过评估网络设备、网络性能和安全威胁来仔细检查…...
MyBatis执行一条sql语句的流程(源码解析)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程(源码解析) MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…...
使用three.js 实现vr全景图展示,复制即可用
1.实现效果 2.代码 1.npm安装three.js npm install three 2.引入three.js import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls 3.初始化模型 init(val) {this.container document.querySelector(.container)// 初始…...
MATLAB关于集合的运算(部分)
集合运算比较两个集合中的元素,以找出共性或差异 i n t e r s e c t intersect intersect表示两组数据的交集 i s m e m b e r ismember ismember表示查找数据的集合成员 u n i o n union union表示两个数据集的并集 u n i q u e unique unique表示查找数据集的…...
谈谈数据产品开发流程
数据产品开发流程涵盖以下关键步骤:首先是需求调研与规划,通过与业务部门等沟通,明确产品定位、受众及功能,制定项目计划。接着进行数据采集与处理,确定数据源,运用合适工具采集并清洗、转换数据后存储。然…...
Unity3D仿星露谷物语开发12之创建道具列表
1、目标 道具是游戏的核心部分,道具包括你可以拾取的东西,你可以使用的工具和你能种的东西等。 本节就是创建道具的信息类。同时了解ScriptableObject类的使用。 2、创建道具枚举类 修改Assets -> Scripts -> Enums.cs脚本, 新增如…...
Linux(Centos 7.6)常见基础配置
1.网络配置 网络配置详见:VMware安装Linux(Centos 7.6)后网络配置 2.yum源配置 yum源配置详见:Linux(Centos 7.6)yum源配置 3.主机名配置 1.Linux(Centos 7.6)系统安装后,没有配置主机名时,root用户登录后,是如下…...
2024年底关于期货的工作总结
十几年程序猿出身,因几年前的懵懂无畏闯入期货市场,盈了,感觉期货太简单,飘然裸辞,想当财务自由者,全职做交易。当深入学习时,却亏了,原来市场是让人敬畏的,也是反人性的…...
python 插入排序(Insertion Sort)
插入排序(Insertion Sort) 插入排序是一种简单的排序算法。它的基本思想是:将数组分为已排序部分和未排序部分,然后逐个将未排序部分的元素插入到已排序部分的正确位置。插入排序类似于整理扑克牌的过程。 插入排序的步骤&#…...
数据库自增 id 过大导致前端时数据丢失
可以看到,前端响应参数是没有丢失精度的 但是在接受 axios 请求参数时出现了精度丢失 解决方案一:改变 axios 字符编码 axios.defaults.headers[Content-Type] application/json;charsetUTF-8; 未解决 解决方案二:手动使用 json.parse() …...
优化租赁小程序提升服务效率与用户体验的策略与实践
内容概要 在这个快速发展的商业环境中,租赁小程序成为了提升服务效率和用户体验的重要工具。通过对用户需求的深入挖掘,我们发现他们对于功能的便捷性、响应速度和界面的友好性有着极高的期待。因此,针对这些需求,完善租赁小程序…...
nvm node.js 版本管理工具
nvm 介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工具,方便切换不同版本的Node.js 使用 nvm 的使用非常的简单,跟 npm 的使用方法类似 下载安装 首先先下载 nvm,下载地址 https://github.com/coreybutler/nvm…...
使用Locust对Redis进行负载测试
1.安装环境 安装redis brew install redis 开启redis服务 brew services start redis 停止redis服务 brew services stop redis 安装Python库 pip install locust redis 2.编写脚本 loadTest.py # codingutf-8 import json import random import time import redis …...
计算机网络与通信复习
因特网的核心部分(电路交换与分组交换的不同点,分组交换的优点) 核心部分:路由器、交换机 我们假如数据就是一个货物,比如说一千公斤的大米,电路交换要有专用通道,不管从起点到终点经过多少个…...
WAV文件双轨PCM格式详细说明及C语言解析示例
WAV文件双轨PCM格式详细说明及C语言解析示例 一、WAV文件双轨PCM格式详细说明1. WAV文件基本结构2. PCM编码方式3. 双轨PCM格式详细说明二、C语言解析WAV文件的代码示例代码说明一、WAV文件双轨PCM格式详细说明 WAV文件是一种用于存储未压缩音频数据的文件格式,广泛应用于音频…...
【华为OD-E卷 - 网上商城优惠活动 100分(python、java、c++、js、c)】
【华为OD-E卷 - 网上商城优惠活动 100分(python、java、c、js、c)】 题目 某网上商场举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为: 每满100元优惠10元,无使用数限制,如100 ~ 199元…...
c# Record关键字
在 C# 9.0 中引入了 record 关键字,用于定义记录类型(Record Types)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相等性比较、生成属性和方法等功能,使得编写数据类更加简洁和高效。 …...
Windows 10 自带功能实现大屏、小屏无线扩展
一、添加可选功能 在作为无线投屏对象的「第二屏」设备上,打开 Windows 10 设置并定位至「应用 > 应用和功能」界面,然后点击右侧界面中的「可选功能」选项。 点击可选功能界面顶部的「添加功能」按钮,搜索「无线显示器」模块并选择添加。…...
Python内存管理揭秘:有效避免内存泄漏,提升程序稳定性
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代软件开发中,内存管理是确保程序高效、稳定运行的关键因素之一。尽管Python凭借其自动垃圾回收机制简化了内存管理,但内存泄漏问题仍…...
论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试
大语言模型拥有的强大能力可以用来辅助多种工作,但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz,它利用模型提示生成模糊测试驱动代码,并将代码片段嵌入到LLVM框架中执行模糊测试。 论文摘要 制作高质…...
网工日记:FTP两种工作模式的区别
FTP 的主动模式和被动模式在连接建立的发起方、数据传输端口以及对网络环境的适应性等方面存在明显区别: 1. 连接发起方 主动模式:数据连接由服务器主动发起。在控制连接建立后,客户端通过 PORT 命令告知服务器自己用于接收数据的临时端口号…...
clickhouse-backup配置及使用(Linux)
一、下载地址 Releases Altinity/clickhouse-backup GitHub 二、上传到服务器解压安装 自行上传至服务器,解压命令: tar xvf clickhouse-backup-linux-amd64.tar.gz 三、创建软连接 sudo ln -sv build/linux/amd64/clickhouse-backup /usr/local/bin/…...
【每日学点鸿蒙知识】模拟器开启网络、长时任务、兼容性测试支持、丢帧定位、SO中访问rawfile等
1、模拟器如何开启网络? 模拟器使用的是电脑本身的网络,不通过代理即可访问网络。 2、创建子window后,锁屏很短时间内,应用会被杀死? 没开长时任务,锁屏和退后台保活要开长时任务。 应用退至后台后&…...
Python 将文字和二维码 生成到BMP上 可以做标签打印等
直接上代码吧,都有注释,看得明白 将代码复制到main.py文件中,就可以调试了 from PIL import Image, ImageDraw, ImageFont import matplotlib.font_manager as fm from matplotlib.font_manager import FontProperties import os import qr…...
pat 乙级1096 大美数
若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。 输入格式: 输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过…...