我们在初学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

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐