Spring使用RedisTemplate存儲鍵值亂碼解決方案 原

    最近在學習 SpringBoot 和 Redis 的集成,使用的時候發現一個問題:通過RedisTemplate存儲進去的鍵值都是16進制的亂碼:

127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x04name"

    通過查閱資料,找到兩種解決方案。

 

    (1) 使用 StringRedisTemplate 替換 RedisTemplate ,是一種較優雅的解決方案:

@Autowired
//private RedisTemplate redisTemplate;
private StringRedisTemplate redisTemplate;// 解決Redis鍵值亂碼問題

    效果很明顯:

127.0.0.1:6379> keys *
1) "name" # 使用 StringRedisTemplate 後解決
2) "\xac\xed\x00\x05t\x00\x04name" # 第一次存的亂碼

 

    (2) 亂碼原因是序列化的問題,我們手動定義序列化的方法,有兩種實現方案,代碼set注入和XML配置,兩者本質是一樣的:

    a.代碼 set 注入:

    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 解決Redis亂碼問題
     * @param redisTemplate
     */
    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        this.redisTemplate = redisTemplate;
    }

    b.XML配置:

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
		p:connection-factory-ref="jedisConnectionFactory">
		<property name="keySerializer">
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>
		<property name="valueSerializer">
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>
		<property name="hashKeySerializer">
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>
		<property name="hashValueSerializer">
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>
	</bean>

    修改後的效果:

127.0.0.1:6379> keys *
1) "name" # 使用 StringRedisTemplate 後解決
2) "name_2" # 指定序列化方法後解決
3) "\xac\xed\x00\x05t\x00\x04name" # 第一次存的亂碼

 

    亂碼的原因,請參考 Spring Data操作Redis時,發現key值出現 \xac\xed\x00\x05t\x00\tb ,通過跟蹤源碼發現的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章