springboot中如何同时操作同一功能
问题描述
测试阶段,由于存在某一功能的同时操作,该功能还是入库逻辑,此时若不进行处理,会造成插入表中多条重复数据,为此该问题需要修复。
解决办法
在接口开始进行对是否存在某个key值的判断,若不存在,则插入一条到redis中并加锁;若存在,则提示“正在处理中”;若中间出现逻辑处理异常,则需要对该key值删除;最后进行对锁的释放;
话不多说,上代码
pom.xml 依赖补充
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.yml文件中redis配置
redis:host: 127.0.0.1port: 6379timeout: 10poolMaxTotal: 1000poolMaxIdle: 500poolMaxWait: 500
UserMapper.java
import com.example.demo.entity.User;import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper {int add(User user);User queryByName(String name);
}
UserMapper.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"><select id="queryByName" resultMap="userResult">select id,name,age from "USER"where name=#{name}</select><insert id="add" parameterType="com.example.demo.entity.User">INSERT INTO "USER" (id,name, age)VALUES (SYS_GUID(),#{name},#{age})</insert>
</mapper>
RedisService类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class RedisService {@AutowiredRedisTemplate<String,Object> redisTemplate;/*** 加锁* @param key* @param value* @param expireTime* @return*/public boolean lock(String key, String value, Long expireTime) {Boolean success = redisTemplate.opsForValue().setIfAbsent(key, value);if (expireTime != null && expireTime > 0) {redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);}return success != null && success;}/*** 释放锁* @param key*/public void unlock(String key) {redisTemplate.opsForValue().getOperations().delete(key);}/*** 根据key删除信息* @param key*/public void deleteStr(String key) {redisTemplate.delete(key);}
}
@bean配置 解决redis内容乱码,为了方便,我这边直接在启动类中配置
@Bean@SuppressWarnings("all")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(factory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);// hash的key也采用jackson的序列化方式template.setHashKeySerializer(jackson2JsonRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}
controller类
该程序对新增用户功能同时操作的模拟,补充redis中key的判断,具体开发逻辑或内容可以视情况而定!
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.service.RedisService;import java.util.List;@RestController
@RequestMapping("/user")
public class UserController {private static final Logger logger = LoggerFactory.getLogger(UserController.class);@Autowiredprivate UserMapper userMapper;@Autowiredprivate RedisService redisService;@PostMapping("/addTest")public void addTest(@RequestBody User user) throws Exception {//todo 该功能的状态校验//1.判断该用户在redis是否存在if (!redisService.lock("addUser", String.valueOf(System.currentTimeMillis()), 15L)) {throw new Exception("正在操作中");}try {//2.逻辑处理User user1 = userMapper.queryByName(user.getName());if (user1 != null) {throw new Exception("该用户" + user.getName() + "已存在!");}for (int i = 0; i < 1000; i++) {for (int j = 0; j < 1000; j++) {logger.info("i*j={}", i * j);}}userMapper.add(user);} catch (Exception e) {redisService.deleteStr("addUser");throw e;} finally {redisService.unlock("addUser");}}
}
测试结果
一用户信息操作结果:

另一用户操作结果:

等待2分钟,该用户继续操作该数据,会提示“该用户已存在!”

相关文章:
springboot中如何同时操作同一功能
问题描述 测试阶段,由于存在某一功能的同时操作,该功能还是入库逻辑,此时若不进行处理,会造成插入表中多条重复数据,为此该问题需要修复。 解决办法 在接口开始进行对是否存在某个key值的判断,若不存在&…...
YOLOWeeds: 用于棉花生产系统中多类杂草检测的 YOLO 目标检测器的新基准
YOLOWeeds: A novel benchmark of YOLO object detectors for multi-class weed detection in cotton production systems 摘要1、介绍2、总结 摘要 过度依赖除草剂控制杂草,加速了杂草的抗除草剂进化,引起了对环境、食品安全和人类健康的日益关注。自动…...
Vue3:自定义图标选择器(包含 SVG 图标封装)
文章目录 一、准备工作(在 Vue3 中使用 SVG)二、封装 SVG三、封装图标选择器四、Demo 效果预览: 一、准备工作(在 Vue3 中使用 SVG) 本文参考:https://blog.csdn.net/houtengyang/article/details/1290431…...
NIO讲解
一:什么是NIO? 二:NIO三大组件 1. channel channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入…...
react中jest配置,解决node_modules报错esm无法解析的问题
重点关注: transformIgnorePatterns: [ "/node_modules/(?!(?:jmfe)/)", ], moduleNameMapper: { "\\.(css|less|scss|sss|styl)$": "jest-css-modules" } 并安装jest-css-modules(npm i --save-dev jest-css-mo…...
Qt6,使用 UI 界面完成命令执行自动化的设计
一、需要完成的功能 在子对话框(CmdChildQt)中,点击 “执行” 按钮,将多个命令行指令,依次输入到父对话框(CmdQt)的编辑框中并且执行,要求如下: 在前一个命令执行完成后&…...
Apache Maven;会话技术
Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。 Maven模型有: 项目对象模型、依赖管理模型、插件 会话技术: 会话:…...
Azure - 机器学习:使用自动化机器学习训练计算机视觉模型的数据架构
目录 一、用于训练的数据架构图像分类(二进制/多类)多标签图像分类对象检测实例分段 二、用于推理的数据格式输入格式输出格式图像分类多标签图像分类对象检测实例分段 了解如何设置Azure中 JSONL 文件格式,以便在训练和推理期间在计算机视觉…...
【C++】stack | queue | priority_queue | deque
一、stack栈 介绍 1.栈是一种特殊的线性表,其元素遵循“后进先出”的原则,即仅允许在在表的一端进行插入、删除操作,这一模式被称为“后进先出”或LIFO(last in fisrt out)。 2.从底层实现来看,stack是作…...
华为gre带验证key案例
配置FW_A。 a.配置接口的IP地址,并将接口加入安全区域。 system-view [sysname] sysname FW_A [FW_A] interface GigabitEthernet 1/0/1 [FW_A-GigabitEthernet1/0/1] ip address 1.1.1.1 24 [FW_A-GigabitEthernet1/0/1] quit [FW_A] interface GigabitEthernet 1/…...
Java算法(三): 判断两个数组是否为相等 → (要求:长度、顺序、元素)相等
Java算法(三) 需求: 1. 定义一个方法,用于比较两个数组是否相同2. 需求:长度,内容,顺序完全相同package com.liujintao.compare;public class SameArray {public static void main (String[] a…...
基于STM32的设计智慧超市管理系统(带收银系统+物联网环境监测)
一、前言 基于STM32+OneNet设计的智慧超市管理系统(2023升级版) 1.1 项目背景 随着IoT技术的不断发展,智能无人超市也越来越受到人们的关注。智能无人超市是指在无人值守的情况下,通过物联网、大数据等技术手段实现自助选购、结算和配送的新型商场。当前设计了一种基于STM32…...
深入浅出理解ResNet网络模型+PyTorch实现
温故而知新,可以为师矣! 一、参考资料 原始论文:Identity Mappings in Deep Residual Networks 原论文地址:Deep Residual Learning for Image Recognition ResNet详解PyTorch实现 PyTorch官方实现ResNet 【pytorch】ResNet18、…...
【C++】万字一文全解【继承】及其特性__[剖析底层化繁为简](20)
前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.继承&复用&组合的区别1&…...
微信小程序之自定义组件开发
1、前言 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦…...
MCU系统的调试技巧
MCU系统的调试技巧对于确保系统稳定性和性能至关重要。无论是在嵌入式系统开发的初期阶段还是在产品维护和优化的过程中,有效的调试技巧可以帮助开发人员快速发现和解决问题,本文将讨论一些MCU系统调试的技巧。 首先,使用调试工具是非常重要…...
【机器学习基础】机器学习概述
目录 前言 一、机器学习概念 二、机器学习分类 三、机器学习术语 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 &#x…...
Python Selenium 执行 JavaScript
简介 Selenium是一个用于自动化浏览器操作的工具,可以模拟人工操作,执行各种浏览器操作,包括点击、输入文字、提交表单等。而JavaScript是一种常用的脚本语言,用于在网页上添加交互性和动态性。在Python中使用Selenium执行JavaSc…...
HTML的表单标签和无语义标签的讲解
HTML的表单标签 表单是让用户输入信息的重要途径, 分成两个部分: 表单域: 包含表单元素的区域. 重点是 form 标签. 表单控件: 输入框, 提交按钮等. 重点是 input 标签 form 标签 使用form进行前后端交互.把页面上,用户进行的操作/输入提交到服务器上 input 标签 有很多形态,能…...
8.spark自适应查询-AQE之自适应调整Shuffle分区数量
目录 概述主要功能自适应调整Shuffle分区数量原理默认环境配置修改配置 结束 概述 自适应查询执行(AQE)是 Spark SQL中的一种优化技术,它利用运行时统计信息来选择最高效的查询执行计划,自Apache Spark 3.2.0以来默认启用该计划。…...
从ChatGPT的‘提示词’到图像修复:PromptIR如何用‘提示学习’教会AI看图说话并‘修图’?
PromptIR:当提示学习遇见图像修复,AI如何像ChatGPT一样"看图说话" 你是否曾经对着模糊的老照片叹气,或是被雾霾笼罩的风景照感到无奈?图像修复技术正以前所未有的速度发展,而最新突破PromptIR将自然语言处理…...
别再死记硬背公式了!手把手带你画图推导‘放苹果’问题的状态转移方程
可视化拆解动态规划:从画图到推导‘放苹果’问题的本质 在算法学习的道路上,动态规划(DP)常常是让初学者望而生畏的难关。那些看似神奇的递推公式,往往被当作黑盒魔法般死记硬背。今天,我们要彻底改变这种学…...
LLM评估技术:从推理型评估器到奖励黑客问题解析
1. LLM评估技术演进与核心挑战在自然语言处理领域,大型语言模型(LLM)作为评估工具的应用正在经历从简单评分到复杂推理的范式转变。传统评估方法主要依赖人工标注或基于规则的系统,但这些方法在灵活性、扩展性和成本效益方面存在明显局限。LLM评估器的出…...
从会议标注到教学演示:ppInk如何成为Windows用户的屏幕标注利器
从会议标注到教学演示:ppInk如何成为Windows用户的屏幕标注利器 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 你是否曾为在线会议中无法清晰表达想法而烦恼?是否在录制教学视频时苦于缺少直观的标注…...
Maven项目集成ProGuard全流程:从pom配置到一键生成混淆Jar包
Maven项目集成ProGuard全流程:从pom配置到一键生成混淆Jar包 在Java企业级开发中,代码保护始终是不可忽视的一环。ProGuard作为业界广泛采用的代码混淆工具,能够有效防止反编译和逆向工程,特别适合需要保护核心业务逻辑的金融、电…...
终极指南:如何用SketchUp STL插件实现完美3D打印转换
终极指南:如何用SketchUp STL插件实现完美3D打印转换 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 你是否经常遇…...
如何把控 AI 生成代码的质量和安全?
从“提速”到“填坑”2025 年到 2026 年,AI 编码工具从开发者的“玩具”变成了日常工作的标配。GitHub Copilot、Claude Code、Cursor、OpenAI Codex……名字越来越多,写的代码也越来越多。但一线工程师的感受却是另一回事:合进来的 PR 变多了…...
InternGPT本地部署实战:指向性交互与多模态AI应用指南
1. 项目概述:当ChatGPT学会了“指指点点” 如果你和我一样,对ChatGPT这类大语言模型(LLM)的文本对话能力感到惊叹,但同时又觉得它在处理图像、视频这类视觉任务时,总隔着一层“语言描述”的纱,…...
Manus被禁止外资收购,全球化资本路径在中美科技脱钩下成“钢丝绳”
1. Manus事件迎来最终结论在创始团队沉默了几个月后,Manus事件迎来了最终结论。据国家发改委网站,4月27日,外商投资安全审查工作机制办公室(国家发展改革委)依法依规对外资收购Manus项目作出禁止投资决定,要…...
RWKV7-1.5B-World算法解析:从Transformer到RNN的架构创新
RWKV7-1.5B-World算法解析:从Transformer到RNN的架构创新 1. 模型架构概览 RWKV7-1.5B-World是一种融合了Transformer和RNN优势的混合架构模型。它保留了Transformer强大的表达能力,同时引入了RNN的高效序列处理特性。这种创新设计使其在处理长序列任务…...
