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
    }
}

补充说明

  1. Redis 事务核心命令

    • multi():开启事务,后续操作会进入事务队列
    • exec():提交事务,执行队列中的所有操作
    • 若需取消事务,可使用 discard() 方法(本示例未涉及)
  2. 关键注意点

    • 事务执行前,所有操作仅入队不执行,因此无法获取真实结果(如示例中事务提交前 get("k1") 返回 null
    • SessionCallback 是 Spring Data Redis 提供的事务支持类,确保多个操作在同一 Redis 连接(会话)中执行,避免事务上下文丢失
posted @ 2026-01-14 14:20  Jing61  阅读(1)  评论(0)    收藏  举报