有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Redis执行Lua脚本与事务冲突

应用程序。yml:

spring:
  redis:
    host: 192.168.1.102
    password: 123456
  datasource:
    druid:
      username: root
      password: 123456
      url: jdbc:mysql://192.168.1.102:3306/shop?useUnicode=true&characterEncoding=utf-8&useSSL=false
      driver-class-name: com.mysql.cj.jdbc.Driver  

server:
  port: 6666

重新配置。爪哇:

@Configuration
//@EnableTransactionManagement
public class RedisConfig {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        StringRedisSerializer serializer = new StringRedisSerializer();
        template.setKeySerializer(serializer);
        template.setValueSerializer(serializer);

        template.setHashKeySerializer(serializer);
        template.setHashValueSerializer(serializer);
        //template.setEnableTransactionSupport(true);
        return template;
    }
}
@SpringBootTest
class DemoApplicationTests {
    @Autowired
    RedisTemplate redisTemplate;

    @Test
    @Transactional
    void test01() {
        /**
         *  token=abcdef stored in redis
         */
        Long result = (Long) redisTemplate.execute(new DefaultRedisScript("if redis.call('get',KEYS[1])== ARGV[1] then return redis.call('del',KEYS[1]) else " +
                "return 0 end", Long.class), Collections.singletonList("token"), "abcdef");

        System.out.println(result); // console will print 1,the token in redis will be deleted
 
    }
}

Lua脚本可以在不使用事务的情况下正常执行

我在下面的测试中添加了事务管理,但出现了一些问题

@Configuration
@EnableTransactionManagement //Configuration enabling Transaction Management
public class RedisConfig {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        StringRedisSerializer serializer = new StringRedisSerializer();
        template.setKeySerializer(serializer);
        template.setValueSerializer(serializer);

        template.setHashKeySerializer(serializer);
        template.setHashValueSerializer(serializer);
        template.setEnableTransactionSupport(true); //Configures RedisTemplate to participate in transactions by binding connections to the current thread.
        return template;
    }   
}
@SpringBootTest
class DemoApplicationTests {
    @Autowired
    RedisTemplate redisTemplate;

    @Test
    @Transactional
    void test01() {
        /**
         *  token=abcdef stored in redis
         */
        Long result = (Long) redisTemplate.execute(new DefaultRedisScript("if redis.call('get',KEYS[1])== ARGV[1] then return redis.call('del',KEYS[1]) else " +
                "return 0 end", Long.class), Collections.singletonList("token"), "abcdef");

        System.out.println(result); // console will print null,the token in redis will not be deleted

    }
}

当我使用@EnableTransactionManagement时,lua脚本无法正常执行

为什么lua脚本的执行结果返回null

如何在不影响lua脚本执行的情况下使用事务


共 (0) 个答案