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

ops/2025/1/8 19:22:27/

在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.ppmy.cn/ops/42420.html

相关文章

win11安装docker运行Open-Webui 界面化展示 ollama大模型

1.OpenWeb UI运行需要docker 环境下载docker Get Started | Docker 2.需要命令提示符docker -v 查询是否安装成功&#xff1b; 查询docker详情docker version 3.github拉取open-webUi镜像Package open-webui GitHub 复制命令运行在命令提示符&#xff1b; 等待下载完成 4.到…

信息泄露--注意点点

目录 明确目标: 信息泄露: 版本软件 敏感文件 配置错误 url基于文件: url基于路由: 状态码: http头信息泄露 报错信息泄露 页面信息泄露 robots.txt敏感信息泄露 .get文件泄露 --判断: 搜索引擎收录泄露 BP: 爆破: 明确目标: 失能 读取 写入 执行 信息泄…

Docker数据卷(volume)

数据卷 数据卷是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。&#xff08;容器内目录与宿主机目录对应的桥梁&#xff0c;修改宿主机对应的目录&#xff0c;docker会映射到容器内部&#xff0c;相当于修改了容器内的&#xff0c;反之也一样&#xff09;数…

“Excel+中文编程”衍生新型软件,WPS用户:自家孩子

你知道吗&#xff0c;我们中国人有时候真的挺有创新精神的。 你可能熟悉Excel表格&#xff0c;也可能听说过中文编程&#xff0c;但你有没有脑洞大开&#xff0c;想过如果把这两者结合起来&#xff0c;会碰撞出什么样的火花呢&#xff1f; 别不信&#xff0c;跟着我来看看吧&a…

【bug 记录】

bug记录 将数码管和led线程放在一起 有bug 当先开启数码管响应后&#xff0c;再去控制led&#xff0c;led控制会被数码管的响应覆盖&#xff1b; 所以在数码管的条件语句中需要添加一句将数码管指令赋值为0x70&#xff1b; ioctl传参的时候cmd的数据类型unsigned char会报错&a…

PostgreSQL自带的命令行工具25- ecpg

PostgreSQL自带的命令行工具25- ecpg ecpg 是 PostgreSQL 提供的一个工具&#xff0c;允许在 C 语言程序中嵌入 SQL 语句&#xff0c;从而能够与 PostgreSQL 数据库进行交互。ecpg 全称是 Embedded SQL in C&#xff0c;采用了标准的 SQL 预编译技术&#xff0c;将 SQL 语句嵌…

【大比武07】人工智能技术赋能城建档案高质量发展

关注我们 - 数字罗塞塔计划 - # 大比武2024 本篇是参加“华夏伟业”杯第二届档案信息化公司业务与技术实力大比武&#xff08;简称“大比武 2024”&#xff09;的投稿文章&#xff0c;来自讯飞知喻&#xff08;安徽&#xff09;科技有限公司&#xff0c;作者&#xff1a;张海剑…

nginx安装Stream模块配置tcp/udp端口转发

下载 wget https://nginx.org/download/nginx-1.18.0.tar.gz安装依赖 yum -y install gcc gcc-c make automake autoconf pcre pcre-devel zlib zlib-devel openssl openssl-devel libtool配置 ./configure --prefix/usr/local/nginx --sbin-path/usr/local/nginx/sbin/ngin…