使用spring-data-redis中事务操作的注意事项

场景:

使用redis缓存配置数据,采用hash结构缓存数据,考虑并发和一定的事务需求

环境

springboot 2.2.4,spring-data-redis 2.2.4,redis 5

两个注意点

使用redismanager查看存储的数据结构

现在要进行数据的插入操作,前提是param-param001的值不能改变,且保证隔离性(redis单线程)

针对hash的watch

如下图,这里要将key和hashKey作为watch参数,否则不会生效

operations.watch(Arrays.asList("param", "param001"));
operations.multi();

operations.exec的返回值获取

// 使用最普通的execute,返回结果就是sessioncallback的return结果
Object execute = redisTemplate.execute(new SessionCallback() {
            @Override
            public Object execute(RedisOperations operations) throws DataAccessException {
                List exec;
                do {
                    operations.watch(Arrays.asList("param", "param001"));
                    operations.multi();
                    // 在这一行断点,执行至此的时候,通过控制台改变param001对应的value值
                    operations.opsForHash().put("param", "param002", parameter);
                    exec = operations.exec();
                    System.out.println(exec);
                    operations.unwatch();
                } while (exec.size() == 0);
                return true;
            }
        });

而如果使用redisTemplate.executePipeLined,callback中的operations.exec是无法获取到返回值的,不论成功失败都返回常务为0的list也就无法满足事务回滚重试的需求,解决方法是,将redisTemplate.executePipeLined包在do while里,类似于redisTemplate.execute内部非do while

这两种重试的方法各有好处

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值