springboot使用@Transactional + redis缓存,导致缓存获取值为null

原因如果执行的是读操作,由于连接对象不是代理对象,读操作并不会重新创建一个连接,而是使用当前连接,并且放在事务中运行,因此读操作并不会立即执行而是等到事务提交时才能执行,导致读操作读取的结果为nul
解决方案获取的时候释放一下资源

 @Autowired
    private RedisTemplate redisTemplate ;
    @Test
    @Transactional
    public void test1(){
        //方法一:设置redis不开启事务
//        redisTemplate.setEnableTransactionSupport(false);
        //方法二:释放资源
        RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());
        System.out.println(redisTemplate.boundSetOps("blindBoxGoods:2").members().size());
    }

实际应用场景中发现
方案一:第一次获取数据 size=0 ,第二次为正确值(第一次请求取值为空,然后前端再次请求就有值了,单元测试未发现问题),暂还未知道原因
方案二:未在实际场景中使用,大家可以试一下
最后解决:通过业务层面解决了问题(多人参与,不好采用别的框架)(或采用Redission)


版权声明:本文为weixin_44823155原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。