一.添加 Redis 基础配置
spring:
redis:
host: 127.0.0.1
port: 6379
password:
二.开启 Redis 事务配置
@Configuration
@EnableTransactionManagement // 1
public class RedisConfig {
@Bean
public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory redisConnectionFactory) {
// 配置redisTemplate
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
// 打开事务支持
stringRedisTemplate.setEnableTransactionSupport(true); // 2
return stringRedisTemplate;
}
@Bean
public PlatformTransactionManager transactionManager() throws SQLException {
return new DataSourceTransactionManager(dataSource()); // 3
}
@Bean
public DataSource dataSource() throws SQLException {
// ...
}
}
- 开启 SpringBoot 事务管理。
- 通过绑定 Connection 的方式开启 Redis 事务支持。
- 事务管理需要 PlatformTransactionManager。而 Spring Data Redis 自身没有 PlatformTransactionManager 的实现。所以需要指定一个已有的 PlatformTransactionManager 供 Spring Data Redis 使用。如果你已经配置了 JDBC ,则这步可以省略。
参考官方文档:https://docs.spring.io/spring-data/redis/docs/2.1.5.RELEASE/reference/html/#tx
三.Redis 工具类实现
@Repository
public class RedisDAOImpl implements RedisDAO {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public void set(String key, String value) {
stringRedisTemplate.opsForValue().set(key, value);
}
@Override
public String get(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
@Override
public boolean del(String key) {
return stringRedisTemplate.delete(key);
}
}
四、使用方式及测试类
在需要进行事务的方法上,添加 @Transactional 注解即可。可同时对方法中多个数据源操作实现共同事务。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = XXX.class)
public class RedisTest {
@Autowired
private RedisDAO redisDAO;
@Test
@Transactional(rollbackFor = Exception.class)
public void sendAttachmentsMail() {
redisDAO.set("test1", "22");
int i = 1 / 0; // 异常代码
redisDAO.set("test2", "11");
}
}
五、结果
127.0.0.1:6379> keys *
(empty list or set)
可见,因为“四”中的异常代码,“test1”未能如愿插入,事务生效。