一.添加 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”未能如願插入,事務生效。