使用StringRedisTemplate進行事務操作
阿新 • • 發佈:2018-12-14
首先配置StringRedisTemplate使其支援事務
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
//使其支援事務
template.setEnableTransactionSupport (true);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping. NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
其次,需要多個對redis的操作(如修改、刪除)使用同一個連線,可以使用stringRedisTemplate.excute(new SessionCallBack<Object>(){ @Override @SuppressWarnings(“unchecked”) public <K, V> Object execute(RedisOperations<K, V> redisOperations) throws DataAccessException { //將各種對redis的操作封裝成一個方法,呼叫即可; return null; } }); })
例如
public void deleteApiUserTokenInRedis(ApiUser u){
String apiUserNameKey = KeyUtil.getApiUsernameKey(u.getUserName());
String apiUserTokenKey = KeyUtil.getApiUserTokenKey(redisService.getByApiUserNameKey(apiUserNameKey));
redisTemplate.execute(new SessionCallback<String>() {
@Override
@SuppressWarnings("unchecked")
public <K, V> String execute(RedisOperations<K, V> redisOperations) throws DataAccessException {
//redisSession(list, (RedisOperations<String, String>) redisOperations, tbName);
delKey(apiUserNameKey,(RedisOperations<String, String>)redisOperations,apiUserTokenKey);
return null;
}
});
}
private void delKey(String apiUserNameKey, RedisOperations<String, String> redisOperations, String apiUserTokenKey){
redisOperations.delete(apiUserNameKey);
//測試回滾
// int i = 1/0;
redisOperations.delete(apiUserTokenKey);
}
```
### 注意:delKey方法中的程式碼不要捕獲異常,否則回滾不會生效。