
redisson 默认使用 kryo 进行高效序列化,而非 java 原生序列化;jcache 接口层不干预序列化逻辑,实际行为由 redisson 底层配置决定,开发者可通过自定义编解码器灵活控制。
Redisson 对 JCache(JSR-107)的支持是通过 RedissonClient.getCache(...) 实现的,其底层完全复用 Redisson 自身的序列化机制。关键点在于:JCache 规范本身不定义序列化方式,而 Redisson 作为实现方,独立决定如何将对象转为字节流存入 Redis。
✅ 默认序列化器:Kryo(非 Java 原生)
Redisson 默认采用 Kryo 作为序列化器(自 v3.15.0 起成为标准配置),而非 java.io.Serializable 的默认 JVM 序列化。这意味着:
- 你无需强制要求缓存对象实现 Serializable;
- java.time.LocalDate、java.time.Instant、List
等 JDK 类型可直接缓存(Kryo 内置支持); - 序列化体积更小、性能更高、无 serialVersionUID 兼容性问题;
- Redis 中存储的是二进制数据(非可读文本),可通过 redis-cli 的 GET 命令观察到乱码字节 —— 这正是 Kryo 序列化的典型特征,而非 Java 原生序列化(后者以 AC ED 00 05 开头)。
? 验证方式:在 Redis 中执行 DEBUG OBJECT 或检查 TYPE + GET 结果,若返回不可读二进制且不含 java.lang. 类签名,基本可确认为 Kryo。
⚙️ 如何自定义序列化行为?
你完全可以替换或扩展默认序列ization 策略。例如,启用 JSON 序列化(便于调试与跨语言兼容):
Config config = new Config(); config.setCodec(new JsonJacksonCodec()); // 使用 Jackson,需添加 redisson-jackson 依赖 RedissonClient redisson = Redisson.create(config); Cachecache = redisson.getCache("myCache", new org.redisson.codec.JsonJacksonCodec());
也可注册自定义 Kryo 兼容类(适用于复杂业务对象):
config.setCodec(new SerializationCodec() {
@Override
public byte[] encode(T obj) throws IOException {
// 自定义编码逻辑,如添加版本头、加密等
return kryo.writeClassAndObject(new Output(), obj).toBytes();
}
@Override
public T decode(byte[] bytes, Class type) throws IOException {
return (T) kryo.readClassAndObject(new Input(bytes));
}
}); ⚠️ 注意事项与最佳实践
- ❌ 不要依赖 Serializable 接口:即使你的类实现了它,Redisson 默认也不会调用 ObjectOutputStream;
- ✅ 优先使用 Kryo 或 Jackson:二者更安全、高效、可维护;仅在遗留系统集成时考虑 JavaSerializationCodec(不推荐);
- ? 若使用自定义类,请确保:
- 所有字段类型均可被所选编解码器处理(如 Kryo 需注册无参构造器、避免 lambda);
- 在集群/多节点环境中,编解码器配置必须严格一致;
- ? 测试序列化兼容性:升级 Redisson 版本前后,建议对核心缓存对象做 encode → decode → equals 断言验证。
总之,Redisson 的序列化是显式可控、高度可插拔的,默认 Kryo 方案已在生产环境经过大规模验证。与其被动接受“透明行为”,不如主动选择最适合你数据模型与运维需求的编解码器。










