我们在初学Spring Data Redis时,肯定会遇到一个问题,就是他的序列化问题。当我们不指定序列化器时,默认Key、Value、HashKey、HashValue的序列化器都是null,然后会调用JdkSerializationRedisSerializer类来进行序列化。一般情况下,我们都不会使用默认的JDK序列化器,而是指定别的序列化器来使用。

指定序列化器:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        // 创建Template
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(connectionFactory);
        // 创建序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // key和 hashKey采用 string序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // value和 hashValue采用 JSON序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        // 返回redisTemplate
        return redisTemplate;
    }
}

对Redis进行操作:

@SpringBootTest
class RedisDemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("name","某某某");
    }
}

在Redis命令行客户端中查看结果:

        此时看起来是一堆乱码,会让初学者觉得指定的序列化器没有生效(PS:就是我这个倒霉蛋),还是在使用默认的序列化器。那这到底是为什么呢?指定的序列化器真的没有生效么?

        其实已经生效了,只是因为redis存入中文默认是16进制 当你直接在redis命令行客户端查看的时候其实不是乱码,只是redis把中文字符串转为了16进制。我们想要直接看到中文可以使用redis-cli --raw命令,来强制正常显示中文。

如图:

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐