關於在SpringBoot中使用RedisTemplate序列化的一些問題


  在日常的項目中redis已經成為必不可少的一部分,本人以前redis用的不是很多,並且用的是redis的jedis實現。最近,想着在SpringBoot中使用redis,之前做過一些了解但是沒有具體用過,這次具體實踐的時候發現了一些小問題,在此記錄一下。

  本人使用的SpringBoot版本為2.1.13.RELEASE,SpringBoot 2.X版本以后集成的redis為Luttuce實現。在使用的過程中先添加依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

  添加配置

spring:
  redis:
    host: localhost
    password:
    port: 6379

  測試

@RestController
public class RedisController {
  
    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/testForString")
    public String testForString(){
        redisTemplate.opsForValue().set("name","zhangsan");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name:"+name);
        return "success";
    }
}

 

 

 說明執行成功,我們通過redis客戶端看下數據

 

 

 通過keys *(不建議使用,自己測試用的)查看,發現存key為\xac\xed\x00\x05t\x00\x04name的數據

 

 

 \xac\xed\x00\x05t\x00\x04name對應的值為\xac\xed\x00\x05t\x00\bzhangsan

 

 

 由上可以看出數據是存到了redis中,只不過在存入的過程中做了一定處理。網上查了一下是序列化的問題,RedisTemplate的keySerializer和valueSerializer默認使用的是JdkSerializationRedisSerializer,此處我們需要重新設置一下keySerializer和valueSerializer

 

 

 網上隨便搜了下方法,有如下方法

    @Bean
    public RedisTemplate<Object, Object> redisTemplateKeyObject(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

再次執行測試方法,發現沒有效果。我們打斷點跟一下代碼

 

 發現設置沒生效。網上查了下應該是自動配置導致了,找到Redis自動配置類看了下

 

 

@ConditionalOnMissingBean(name = {"redisTemplate"})

當找不到name為redisTemplate的Bean時會自動注入RedisTemplate。在看下我們上面設置RedisTemplate的代碼,發現對應的name為redisTemplateKeyObject,我們將其修改一下

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

 

 現在可以通過redis客戶端查看數據了。以上就是自己使用RedisTemplate的一次實踐,其中遇到了一些小問題,在此記錄一下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM