在Spring Boot中Redis实现事务有哪些方式?

在Spring Boot中操作Redis并实现事务有多种方式,常见的有以下几种:

1. 使用Spring Data Redis的SessionCallback

Spring Data Redis提供了SessionCallback接口,允许你在一个会话中执行多个Redis操作,从而实现事务。具体步骤如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Service;@Service
public class RedisTransactionService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void executeTransaction() {redisTemplate.execute(new SessionCallback<Object>() {@Overridepublic <K, V> Object execute(RedisOperations<K, V> operations) throws DataAccessException {operations.watch("key1", "key2");operations.multi();operations.opsForValue().set("key1", "value1");operations.opsForValue().set("key2", "value2");List<Object> results = operations.exec();if (results == null) {// 事务被取消,重试或其他处理}return results;}});}
}

2. 使用RedisTemplate的事务支持

RedisTemplate也直接支持事务,可以通过以下方式使用:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;@Service
public class RedisTransactionService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void executeTransaction() {redisTemplate.setEnableTransactionSupport(true);redisTemplate.watch("key1", "key2");redisTemplate.multi();try {redisTemplate.opsForValue().set("key1", "value1");redisTemplate.opsForValue().set("key2", "value2");List<Object> results = redisTemplate.exec();if (results == null) {// 事务被取消,重试或其他处理}} catch (Exception e) {redisTemplate.discard();}}
}

在这个例子中,redisTemplate.setEnableTransactionSupport(true)用于启用事务支持,redisTemplate.multi()用于开启事务,redisTemplate.exec()用于提交事务,如果中间出现异常,则调用redisTemplate.discard()取消事务。

3. 使用Redis的Lua脚本实现事务

在某些复杂场景下,可以通过执行Lua脚本来实现事务。Lua脚本在Redis中是原子执行的,因此可以确保事务性。可以通过redisTemplate.execute方法来执行Lua脚本。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Service;import java.util.Collections;@Service
public class RedisTransactionService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void executeTransaction() {String luaScript = "redis.call('SET', KEYS[1], ARGV[1]) " +"redis.call('SET', KEYS[2], ARGV[2])";DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();redisScript.setScriptText(luaScript);redisScript.setResultType(Long.class);redisTemplate.execute(redisScript, Collections.singletonList("key1"), "value1", "value2");}
}

在这个例子中,luaScript变量定义了一个Lua脚本,该脚本将两个键值对设置在Redis中。通过redisTemplate.execute方法来执行这个脚本。

总结

以上三种方式都可以在Spring Boot中实现对Redis的事务支持。选择哪种方式取决于具体的业务需求和使用场景。通常,使用Spring Data Redis的SessionCallback是较为直接和简便的方法,但对于更复杂的需求,可以考虑使用Lua脚本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware ESXI 7.0安装部署

1、为什么要虚拟化&#xff1f; 目前&#xff0c;物理服务器存在以下几个问题&#xff1a; 1&#xff09;硬件资源利用率低&#xff1b; 2&#xff09;可靠性不足&#xff0c;物理服务器宕机即可造成整体业务停摆&#xff1b; 3&#xff09;维护量大&#xff0c;无法实现统…

7个常见的SQL慢查询问题及其解决方法

大家好&#xff0c;得益于摩尔定律&#xff0c;计算机性能已大幅提升&#xff0c;加上数据库的进步以及微服务所倡导的各种反模式设计&#xff0c;因此现在编写复杂SQL查询的机会越来越少。业界已经开始提倡不要进行专门的SQL优化&#xff0c;因为节省下来的资源并不足以抵消员…

人工智能的明天:机器学习与自动化的演进之旅

方向一&#xff1a;技术革新与行业应用 现状分析&#xff1a; 当前的IT行业正处于一个技术革新的高峰期。量子计算虽然还处于研究和开发阶段&#xff0c;但其潜力巨大&#xff0c;未来可能在药物发现、材料科学和复杂系统模拟等领域带来突破。虚拟现实&#xff08;VR&#xff…

JAVA面试题大全(九)

1、为什么要使用 spring&#xff1f; 方便解耦&#xff0c;便于开发支持aop编程声明式事务的支持方便程序的测试方便集成各种优秀的框架降低JavaEE API的使用难度 2、解释一下什么是 aop&#xff1f; AOP 是 Aspect-Oriented Programming 的缩写&#xff0c;中文翻译为“面向…

HTML5表单控件:新时代的交互魔法手册

&#x1f680;HTML5表单控件&#xff1a;新时代的交互魔法手册 &#x1f3af;HTML5表单控件速览&#xff1a;新面孔&#xff0c;新功能1. 日期时间选择器&#xff08;Date & Time Picker&#xff09;2. 数字输入框&#xff08;Number Input&#xff09;3. 搜索框&#xff0…

argparse.ArgumentParser()用法举例

1. 应用场景 我们在玩深度学习&#xff0c;训练模型的时候&#xff0c;会涉及到很多的参数&#xff0c;这个时候就需要用到argparse.ArgumentParser()方法&#xff0c;它的优点是方便在命令行调用的时候修改参数&#xff0c;为了快速了解该方法的应用&#xff0c;这里举例说明…

如何通过LoadRunner进行全链路压测

LoadRunner是Micro Focus公司开发的一款性能测试工具&#xff0c;广泛应用于企业级应用的性能和负载测试。全链路压测&#xff08;End-to-End Load Testing&#xff09;是对整个系统在真实负载下的表现进行测试&#xff0c;涵盖前端、后端和所有中间组件。以下是通过LoadRunner…

深度学习之Tensorflow卷积神经网络手势识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手势识别是计算机视觉和人工智能领域的重要应用之一&#xff0c;具有广泛的应用前景&#xff…

日用百货元宇宙 牛奶、羊奶、骆驼奶……到底哪个奶营养价值更高?

如今生活水平高了&#xff0c;奶的营养价值日益受到重视。从开始只有牛奶&#xff0c;到现在市面上羊奶、马奶、骆驼奶……花样变得越来越多。但同时很多疑问也随之而来&#xff0c;到底哪种奶营养价值更高&#xff1f;牛奶、羊奶、马奶……有什么区别&#xff1f; 牛奶&#x…

iOS技术之AFNetworking 将数组作为字段参数传给服务器不成功的两种解决方法

第一种方法 1.在AFNetworking的源码中找到AFURLRequestSerialization这个类&#xff1b; 2.在.m文件中搜索AFQueryStringPairsFromKeyAndValue字段, 找到该方法 else if ([value isKindOfClass:[NSArray class]]) {NSArray *array value;for (id nestedValue in array) …

编曲软件FL Studio如何为自己制作的歌曲编写工程信息 flstudio自带工程在哪

FL Studio有着很多的功能&#xff0c;覆盖面非常广&#xff0c;不管是音色调整、界面个性化还是为工程编写信息&#xff0c;都可以在FL Studio中使用。每个工程文件都有它的各种信息&#xff0c;比如标题名称、作者、音乐类型、工程介绍、创建时间等&#xff0c;编写工程信息能…

JVM优化之使用Jstat命令预估JVM运行情况

JVM优化之使用Jstat命令预估JVM运行情况 用 jstat gc -pid 命令可以计算出如下一些关键数据 先给自己的系统设置一些初始性的JVM参数&#xff0c;比如堆内存大小&#xff0c;年轻代大小&#xff0c;Eden和Survivor的比例&#xff0c;老年代的大小&#xff0c;大对象的阈值&…

JavaScript 基础 - 第1天

了解变量、数据类型、运算符等基础概念&#xff0c;能够实现数据类型的转换&#xff0c;结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系 理解什么是数据并知道数据的分类 理解变量存储数据的“容器” 掌握常见运算符的使用&#xff0c;了解优先级关系 知道…

第十五节 huggingface的trainner的_inner_training_loop函数源码解读(epoch)

文章目录 前言一、完整源码呈现1、训练前源码3、训练源码(epoch)二、训练epoch循环源码解读1、epoch循环体前的变量2、开始epochs循环2、训练数据3、每个epoch迭代数step获得4、self.callback_handler.on_epoch_begin调用函数on_epoch_begin函数5、self._load_rng_state载入

Vue前端项目打包,并部署Vue项目到Linux云服务器上

一. vue前端项目打包 1.使用vscode开发项目 2.在config目录下的prod.env.js文件当中配置我们后端服务器的IP地址和端口号&#xff0c;因为这是在实际的部署当中所以必须要在生成环境下进行项目的部署。 如图所示&#xff1a; 3.在config目录下的index.js文件当中要改assetsPu…

Linux配置nginx代理功能

ywtool运维工具下载链接及介绍: 工具下载/介绍/安装页面 目录 一.nginx proxy功能介绍二.配置nginx proxy功能2.1 新增nginx代理配置2.1.1 反向代理(当前只举例https转https)2.1.2 负载均衡(当前只举例https转https) 2.2 修改nginx代理配置2.2.1 手动修改配置文件2.2.2 通过此脚…

U盘文件神秘失踪?别担心,恢复与预防攻略在此!

一、遭遇困境&#xff1a;U盘文件突然不见 在数字时代&#xff0c;U盘已成为我们日常工作中不可或缺的数据存储工具。然而&#xff0c;有时我们可能会遭遇一个令人头疼的问题——U盘中的文件突然不见了。这种情况往往让人措手不及&#xff0c;尤其是对于那些没有备份重要文件的…

显示旋转物体转动速度的仪表

转速表是一种测量并显示旋转物体转动速度的仪表&#xff0c;广泛应用于汽车、飞机、船舶、工业机械等各种领域。它的工作原理和特点概括如下&#xff1a;定义与应用• 定义&#xff1a;转速表是用于测量如汽车发动机轴、电机轴等旋转部件每分钟转数&#xff08;RPM, Revolution…

27.STL vector容器emplace_back和push_back的区别

文章目录 STL vector容器emplace_back和push_back的区别C的三法则和五法则比较emplace_back和push_back函数总结reference 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; STL vector容器emplace_back和push_back的区别 这个问题可以讲是…

Gitlab OpenSSL::Cipher::CipherError(gitlab修改项目500错误)

问题描述 在对 gitlab 进行项目修改保存时候&#xff0c;出现了 500 错误&#xff0c;经查看日志&#xff0c;发现 OpenSSL::Cipher::CipherError 异常&#xff0c;如下图所示&#xff1a; > /var/log/gitlab/gitlab-rails/production.log <OpenSSL::Cipher::CipherErro…