1

应用程序.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

RedisConfig.java:

@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脚本执行的情况下使用事务?

4

0 回答 0