redis执行代码时key和value会以乱码(二进制形式)存储,更准确的说不是乱码,只是redis以二进制的方式存储,这种方式不方便用可视化的redis管理工具查看,所以我们需要将它序列化

自定义RedisTemplate模板(redis的key需序列化,value可以不序列化)

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //设置String类型的key设置序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
 
        //设置Hash类型的key设置序列化器
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
 
        //设置redis链接Lettuce工厂
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        return redisTemplate;
    }
}

我们为什么不对value进行序列化呢

这是因为redis的value最好不要设置String序列化,若设置序列化了,value只能存入String类型,不能存进LocalDateTime、LocalDate、LocalTime等时间类型(若想存这些类型也是可以的,需要将这些数据强转为string类型再存进value里即可),通常开发中我们是不需要查看value的,只需要查看key。

若想value也序列化的话就是用这配置,但是记得若将值存进value的话最好还是要保证要存进去的值是String类型

若想value也序列化的话就是用这配置,但是记得若将值存进value的话最好还是要保证要存进去的值是String类型

/**
 * Redis配置类,设置序列化
 */
@Configuration
public class RedisConfig {
 
    /**
     * 设置序列化
     *
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
 
        // String类型 key序列器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // String类型 value序列器
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
 
        // Hash类型 key序列器
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // Hash类型 value序列器
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
 
        // 把连接工厂放进去
        redisTemplate.setConnectionFactory(connectionFactory);
 
        return redisTemplate;
    }
 
}

Value还是以二进制的形式存进去,这是因为我们没有对value进行序列化,虽然value的格式有点难看,但是这样也可以正常取出来,因为在java代码取value值的时候,还会进行反序列化,不会影响业务的逻辑和数据的正确性