redis的序列化方式是什么?

1 个回答

  • 丁隐
    不必太张扬,是花自然香。
    Redis 本身是一个 **内存键值存储系统**,它**不关心你存的 value 是什么类型的数据**,只以字节数组(byte[])的形式存储键和值。 但在使用 Redis 客户端(特别是在 Java、Spring Boot 等环境中)时,**客户端框架负责序列化与反序列化**,这就是你问的“Redis 的序列化方式”。 ## ✅ Redis 的序列化方式(取决于客户端) ### 🚀 1. 原始 Redis 协议(RESP) - Redis 底层使用 RESP 协议(Redis Serialization Protocol) - 只关心字节:所有 key、value 在 Redis 层面都是 **字符串 或 byte[]** ## ✅ 2. Java 客户端中的序列化方式 以 Spring Boot 使用 Redis 为例,默认使用的是 `RedisTemplate`,它的序列化行为如下: ### 🔹 默认 RedisTemplate 的序列化 | 类型 | 序列化方式 | |-----------------------|------------------------------| | key、hashKey | `StringRedisSerializer`(字符串) | | value、hashValue | `JdkSerializationRedisSerializer`(Java 对象序列化) | > 所以默认情况下你存入一个对象,实际是通过 **Java 原生序列化(ObjectOutputStream)** 转成二进制的。 ## ✅ 3. 常见序列化方案对比 | 序列化器 | 优点 | 缺点 | |--------------------------------|----------------------------------|-----------------------------| | **StringRedisSerializer** | 简单、可读、兼容性好 | 只能存 String | | **JdkSerializationRedisSerializer** | 支持任意 Java 对象 | 序列化体积大、跨语言差 | | **Jackson2JsonRedisSerializer** | JSON 可读性好,兼容性强 | 有类信息时较冗余 | | **GenericJackson2JsonRedisSerializer** | 自动封装类型信息,支持反序列化为对象 | JSON 增加额外字段,体积稍大 | | **FastJsonRedisSerializer** | JSON 性能更高(阿里 fastjson) | 安全性问题较多 | | **Kryo** / **Protostuff** | 二进制高性能序列化 | 非标准,跨语言兼容性差 | ## ✅ 4. Spring Boot 推荐做法(序列化配置示例) ```java @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // key序列化 template.setKeySerializer(new StringRedisSerializer()); // value序列化 template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); return template; } ``` ## ✅ 5. Redis CLI 层面序列化无关 - 从 Redis 命令行工具看 value 是乱码,说明是经过 Java 或其他客户端序列化过的 byte[]。 - Redis CLI 自身不做序列化,只是原样展示字节。 ## 🔚 总结 | 层次 | 序列化方式 | |------------|----------------------| | Redis 本身 | 不做序列化,只存字节 | | Java 客户端 | 如 JDK 序列化、JSON、String、Kryo 等 | | 实际使用建议 | 推荐使用 JSON 序列化(Jackson)或 String 形式(如缓存简单值) |
    发布于 2025-03-27 04:56 •IP属地 浙江
    举报
    评论
    收藏