〖Redis指南④〗Redis序列化实战之RedisSerializer

JDK序列化

RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:

在这里插入图片描述
为什么会变成乱码呢?

我们可以看一下源码:

RedisTemplate默认提供了四种序列化方式

在这里插入图片描述

如果不指定序列化方式,那么默认是采用JDK序列化

在这里插入图片描述

自定义序列化

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

测试

在这里插入图片描述

结果

在这里插入图片描述

序列化实践方案

RedisTemplate的两种序列化实践方案:

方案一:
自定义RedisTemplate
修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

在这里插入图片描述

方案二:
使用StringRedisTemplate
写入Redis时,手动把对象序列化为JSON
读取Redis时,手动把读取到的JSON反序列化为对象

工具

private static final ObjectMapper mapper = new ObjectMapper();

在这里插入图片描述

为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。

猜你喜欢

转载自blog.csdn.net/CSDN_SAVIOR/article/details/125026155