1. 程式人生 > >關於SpringBoot存放Redis出現亂碼的情況

關於SpringBoot存放Redis出現亂碼的情況

在SpringBoot專案中,將值存入Redis資料庫中,會出現亂碼的問題

原因:因為spring-data-redis裡面對key和value都進行了序列化,將其變成byte[]陣列後再呼叫對應的redis java client進行儲存。就會導致存進redis的key發生改變。

解決方法:需要手動定義序列化

1.在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>  

2.重寫RedisTemplate配置【通過註解的形式呼叫】

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
    /**
     * RedisTemplate配置
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        //定義key序列化方式
        //RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long型別會出現異常資訊;需要我們上面的自定義key生成策略,一般沒必要
        //定義value的序列化方式
        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.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

}

                                                                    這樣就愉快地解決了序列化問題啦