在使用 Redis 作为缓存或数据存储时,为什么需要自定义序列化器?通常如何实现一个自定义序列化器?
考察说明
考查对 Redis 序列化机制的理解,以及根据业务需求定制序列化策略的能力。
回答思路
- 【回答框架 1】Redis 客户端(如 Spring Data Redis)默认使用 JDK 序列化,其缺点是序列化后的数据体积大、可读性差,且只有 Java 客户端能反序列化,跨语言兼容性差。自定义序列化器可以选用 JSON、Protobuf 等格式,减小存储占用并提升可读性和跨语言支持。
- 【回答框架 2】实现自定义序列化器通常需要实现客户端提供的序列化接口(如 Spring Data Redis 的 RedisSerializer),并在其中定义 serialize 和 deserialize 方法,指定具体的序列化库(如 Jackson、Gson)来处理对象与字节数组的转换。
- 【回答框架 3】在配置中注册自定义序列化器时,需要分别为 key 和 value 设置,例如使用 StringRedisSerializer 处理 key,使用自定义的 JSON 序列化器处理 value,以确保键的可读性和值的通用性。对于对象类型,需注意其类型信息,避免反序列化时丢失或产生类型转换错误。
- 【关键点 1】默认 JDK 序列化存在体积大、可读性差、跨语言困难的问题。
- 【关键点 2】自定义序列化通常涉及实现 RedisSerializer 接口并指定序列化库。
- 【关键点 3】配置时区分 key 和 value 的序列化器,并注意对象的类型信息。
- 【关键点 4】序列化器选择需权衡性能、可读性和兼容性。
- 【易错点 1】仅自定义 value 序列化器而忽略 key,可能导致 Redis 中键的存储格式不一致。
- 【易错点 2】忽略泛型类型信息,反序列化时可能抛出类型转换异常。
- 【易错点 3】使用 JSON 序列化时未处理空值或循环引用,导致序列化失败。