数据存入redis序列化和反序列化

本文介绍了如何在SpringBoot项目中配置RedisTemplate,包括设置ConnectionFactory、KeySerializer、ValueSerializer,以及使用Jackson2JsonRedisSerializer进行对象到JSON的序列化和反序列化的示例。
//redis序列化配置
private RedisConnectionFactory factory;
    @Bean
    public RedisTemplate redisTemplate(){
        RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        redisTemplate.setValueSerializer(serializer);
        return redisTemplate;

    }
//反序列化代码
 User loginuser = JSON.parseObject(JSON.toJSONString(obj), User.class);//将obj转化为JSON再反序列化为User对象

<think>我们正在解决用户的问题:如何解决将字符串或对象类型存入Redis时未进行序列化的问题? 根据引用内容,我们知道: - 在Java中,Redis存储需要序列化是因为Redis处理的是字符串或二进制数据,而Java对象是复杂的(引用[1][2])。 - 解决方案通常是在使用RedisTemplate时配置序列化器(引用[3][4])。 - 特别需要注意的是,如果使用JSON序列化,可能需要包含类型信息以避免反序列化时的类型转换错误(引用[5])。 因此,我们将提供配置RedisTemplate的步骤,以正确序列化值。 步骤: 1. 配置RedisTemplate,指定keyvalue的序列化器。 2. 对于key,通常使用StringRedisSerializer。 3. 对于value,可以使用多种序列化器,如Jackson2JsonRedisSerializer,并配置ObjectMapper以包含类型信息。 下面是一个配置示例(基于引用[4][5]): </think> ### 解决Redis存储未序列化问题的方案 在Java中将字符串或对象存入Redis时未进行序列化会导致数据无法正确存储读取,以下是完整的解决步骤原理分析: #### 1. **问题根源分析** - Redis仅支持存储二进制安全字符串(或字节序列),而Java对象是结构化数据 - 未序列化时可能出现错误:`java.lang.ClassCastException` 或乱码数据[^2][^5] - 序列化必要性:将对象转换为字节流 → Redis可存储格式 → 反序列化还原对象[^1] #### 2. **解决方案:配置序列化器(SpringBoot环境)** ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate( LettuceConnectionFactory lettuceConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(lettuceConnectionFactory); // Key序列化:字符串格式 template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); // Value序列化:JSON格式(带类型信息) ObjectMapper objectMapper = new ObjectMapper(); objectMapper.activateDefaultTyping( LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY ); Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(objectMapper, Object.class); template.setValueSerializer(serializer); template.setHashValueSerializer(serializer); return template; } } ``` **关键配置说明**: - `StringRedisSerializer`:确保键始终为字符串格式(避免二进制键) - `activateDefaultTyping`:在JSON中添加类路径信息,解决反序列化时的`LinkedHashMap`转换问题[^5] - `Jackson2JsonRedisSerializer`:将对象转换为JSON字符串存储(替代Java原生序列化) #### 3. **使用示例** ```java // 注入配置好的RedisTemplate @Autowired private RedisTemplate<String, Object> redisTemplate; public void saveData() { // 存储字符串(自动序列化redisTemplate.opsForValue().set("user:token", "a1b2c3d4"); // 存储对象(自动序列化为JSON) User user = new User("张三", 25); redisTemplate.opsForValue().set("user:1001", user); } public User getData() { // 反序列化自动还原对象 return (User) redisTemplate.opsForValue().get("user:1001"); } ``` #### 4. **替代方案对比** | 序列化方式 | 优点 | 缺点 | |--------------------------|---------------------------|--------------------------| | Jackson2JsonRedisSerializer | 可读性强,跨语言兼容 | 需处理类型信息 | | JdkSerializationRedisSerializer | Java原生支持 | 二进制格式,不可读 | | StringRedisSerializer | 简单字符串处理 | 仅支持String类型 | #### 5. **常见问题排查** 1. **类型转换异常** 检查是否配置`activateDefaultTyping`(确保JSON包含类信息)[^5] 2. **乱码数据** 确认所有序列化器统一(避免部分序列化/部分未序列化) 3. **连接池配置** 在`application.properties`添加: ```properties spring.redis.lettuce.pool.max-active=8 spring.redis.lettuce.pool.max-wait=-1ms ``` > **关键原则**:存储对象必须通过`RedisTemplate`的ValueSerializer处理,直接使用`StringRedisTemplate`仅适用于纯字符串场景[^3][^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值