StringRedisSerializer等序列化器作用及Redis客户端显示问题咨询
Redis序列化器常见疑问解答
一、为什么用StringRedisSerializer存数据,Redis客户端显示的是字符串而非byte[]?
StringRedisSerializer确实是将String与byte[]互相转换,但Redis本身存储的就是二进制数据(byte[])。你在客户端看到的字符串,是因为Redis客户端会自动把存储的byte[]按默认编码(通常是UTF-8)解码成字符串展示,方便开发者阅读。
比如执行stringRedisTemplate.opsForValue().set("hello","world");时:
- StringRedisSerializer把"hello"和"world"分别转成UTF-8编码的byte[]
- Redis服务器存储这些byte[]
- 客户端读取到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
相关产品推荐
相关产品推荐

