1. 程式人生 > >使用StringRedisTemplate進行事務操作

使用StringRedisTemplate進行事務操作

首先配置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方法中的程式碼不要捕獲異常,否則回滾不會生效。