You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

StringRedisSerializer等序列化器作用及Redis客户端显示问题咨询

Redis序列化器常见疑问解答

一、为什么用StringRedisSerializer存数据,Redis客户端显示的是字符串而非byte[]?

StringRedisSerializer确实是将String与byte[]互相转换,但Redis本身存储的就是二进制数据(byte[])。你在客户端看到的字符串,是因为Redis客户端会自动把存储的byte[]按默认编码(通常是UTF-8)解码成字符串展示,方便开发者阅读。

比如执行stringRedisTemplate.opsForValue().set("hello","world");时:

  1. StringRedisSerializer把"hello"和"world"分别转成UTF-8编码的byte[]
  2. Redis服务器存储这些byte[]
  3. 客户端读取到byte[]后,自动解码为字符串显示,所以你看到的是"hello"和"world",而非原始的byte数组内容。

二、JdkSerializationRedisSerializer的作用

  • 核心作用:基于JDK原生序列化机制,实现任意实现Serializable接口的Java对象与byte[]的互相转换。
  • 特点:
    • 无需额外依赖,JDK原生支持
    • 序列化后的byte[]体积较大,Redis客户端查看时是不可读的二进制乱码
    • 序列化与反序列化必须依赖完全一致的类结构(包括类名、字段、访问权限等),否则会抛出反序列化异常
  • 代码示例:
// 定义实现Serializable的实体类
public class User implements Serializable {
    private String name;
    private Integer age;
    // 构造器、getter、setter省略
}

// 配置并使用JdkSerializationRedisSerializer
RedisTemplate<String, User> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.opsForValue().set("user:1", new User("张三", 25));
// 读取数据
User user = redisTemplate.opsForValue().get("user:1");

三、GenericJackson2JsonRedisSerializer的作用

  • 核心作用:基于Jackson JSON库,将Java对象转换为JSON格式的byte[]存储(本质是先把对象转成JSON字符串,再编码为byte[]),读取时反向还原为Java对象。
  • 特点:
    • 序列化后的内容为JSON格式,Redis客户端可直接解码阅读
    • 无需对象实现Serializable接口
    • 会自动在JSON中添加@class字段存储对象全类名,确保反序列化时能准确还原为原对象类型
  • 代码示例:
// 定义普通实体类(无需实现Serializable)
public class Order {
    private String orderId;
    private BigDecimal amount;
    // 构造器、getter、setter省略
}

// 配置并使用GenericJackson2JsonRedisSerializer
RedisTemplate<String, Order> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.opsForValue().set("order:1001", new Order("OD20240501001", new BigDecimal("99.9")));
// 读取数据
Order order = redisTemplate.opsForValue().get("order:1001");

内容的提问来源于stack exchange,提问作者Yu ZhiHang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:52:26