Spring Boot 使用 Redis 事务
Spring Boot 使用 Redis 事务
以下是 Spring Boot 整合 Redis 实现事务操作的完整代码示例,包含详细注释说明:
package com.springboot;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
/**
* Redis 事务操作测试类
* 说明:Spring Boot 中通过 StringRedisTemplate 结合 SessionCallback 实现 Redis 事务
* Redis 事务特性:批量操作、原子性执行(要么全部执行,要么全部不执行)
*/
@SpringBootTest
public class RedisTest {
// 注入 StringRedisTemplate
@Autowired
private StringRedisTemplate template;
/**
* 测试 Redis 事务功能
* 核心逻辑:通过 SessionCallback 保证多个 Redis 操作在同一个会话中,并通过 multi/exec 开启和提交事务
*/
@Test
public void transaction() {
/**
* SessionCallback: 用于封装同一 Redis 会话中的多个操作,确保所有操作都在同一个事务上下文中执行
* 泛型参数 Object 表示 execute 方法的返回值类型
*/
var callback = new SessionCallback<Object>() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
// 1. 开启 Redis 事务(multi 命令)
operations.multi();
// 2. 向事务队列中添加操作指令(此时指令并未执行,仅入队)
operations.opsForValue().set("k1", "v1"); // 设置键 k1 的值为 v1
operations.opsForValue().set("k2", "v2"); // 设置键 k2 的值为 v2
operations.opsForValue().set("k3", "v3"); // 设置键 k3 的值为 v3
// 3. 事务执行前获取值:由于指令仅入队未执行,此处获取结果为 null
var value = operations.opsForValue().get("k1");
System.out.println("事务提交前value: " + value); // 输出:事务提交前value: null
// 4. 提交事务(exec 命令):执行队列中的所有指令,事务正式生效
operations.exec();
// 5. 返回结果(此处返回的是事务执行前获取的 null 值)
return value;
}
};
// 执行 SessionCallback 中的事务操作
template.execute(callback);
// 事务提交后,再次获取 k1 的值(此时事务已执行,能获取到真实值)
var value = template.opsForValue().get("k1");
System.out.println("事务提交后value: " + value); // 输出:事务提交后value: v1
}
}
补充说明
-
Redis 事务核心命令:
multi():开启事务,后续操作会进入事务队列exec():提交事务,执行队列中的所有操作- 若需取消事务,可使用
discard()方法(本示例未涉及)
-
关键注意点:
- 事务执行前,所有操作仅入队不执行,因此无法获取真实结果(如示例中事务提交前
get("k1")返回null) SessionCallback是 Spring Data Redis 提供的事务支持类,确保多个操作在同一 Redis 连接(会话)中执行,避免事务上下文丢失
- 事务执行前,所有操作仅入队不执行,因此无法获取真实结果(如示例中事务提交前

浙公网安备 33010602011771号