springboot集成redis存对象乱码如何解决

springboot集成redis存对象乱码

其实本质上不算是一种乱码,只是序列化之后存储的东西而已,当我们使用RedisTemplete存储对象,时,如果该对象没有被序列化则会报错,序列化之后得到的不是自己想要的数据,为了解决这种方法,我们可以使用 StringRedisTemplete

话不多说上代码

默认使用redistemplete时

/**
* title: list
*
* 当我们保存到redis中的是一个对象时,我们会发现会报错,提示我们需要序列化 ,
* 当我们继承了序列化接口之后,查看设置的值时,我们发现设置的值不是原来的样字,
* 此时我们可以通过两种方式解决
* 1.
*
* @author : ZHeng
*/
@SpringBootTest
public class RedisListTest01 {

// @Autowired
// StringRedisTemplate stringRedisTemplate;


@Autowired
RedisTemplate redisTemplate;


@Test
public void test(){
redisTemplate.opsForValue().set("
user1"
,new User(2,"
lisi"
,19));

System.out.println(redisTemplate.opsForValue().get("
user1"
));

}
}

当我们运行时会发现报错了!提示我们User对象没有序列化。

SpringBoot集成Redis存对象乱码这里有完美解决方案!

org.springframework.data.redis.serializer.SerializationException: Cannot serialize;
nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer;
nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.xxx.redis01.model.User]

.....Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.xxx.redis01.model.User] at org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43) at org.springframework.core.serializer.Serializer.serializeToByteArray(Serializer.java:56) at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:60) ... 72 more

Process finished with exit code -1

当我们给User对象序列化之后运行

public class User implements Serializable {
private Integer id;

private String name;

private Integer age;

//省略getter setter toString等
}

天啦噜,竟然不乱码了!!! ,但是&
ndash;
当你使用linux 远程连接后查看keys 时你会发现,欸? 这里乱码了。。。

2022-04-01 20:32:07.666 INFO 18640 --- [ main] com.xxx.redis01.RedisListTest01 : No active profile set, falling back to 1 default profile: "
default"
2022-04-01 20:32:07.998 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!2022-04-01 20:32:08.000 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.2022-04-01 20:32:08.018 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 5 ms. Found 0 Redis repository interfaces.2022-04-01 20:32:08.752 INFO 18640 --- [ main] com.xxx.redis01.RedisListTest01 : Started RedisListTest01 in 1.488 seconds (JVM running for 2.517)User{id=2, name='
lisi'
, age='
19'
}

Process finished with exit code 0

这是什么鬼? 明明是user1 这是啥啊

127.0.0.1:6379>
keys *
¬쳵ser1 可以考虑使用StringRedisTemplete

解决方式肯定不是只有一种,只是自己学习记录,,仅供参考

@SpringBootTest
public class RedisListTest01 {

@Autowired
StringRedisTemplate stringRedisTemplate;


@Test
public void test(){
stringRedisTemplate.opsForValue().set("
user1"
,new User(2,"
lisi"
,19).toString());

System.out.println(stringRedisTemplate.opsForValue().get("
user1"
));

}
}

成功拿到

User{id=2, name='
lisi'
, age='
19'
}

我们在linux下看看,同样ok

127.0.0.1:6379>
keys *
user1
127.0.0.1:6379>
get user1
User{id=2, name='
lisi'
, age='
19'
}
127.0.0.1:6379>

当然还有另一种方式,存入JSON格式,这里就不放代码了.

解决redis乱码问题直接添加一个配置类就行了/**解决redis中文乱码
* Created by dgx on 2019/8
*/
@Configuration
public class Config {

@Autowired
private RedisTemplate redisTemplate;


@Bean
public RedisTemplate redisTemplateInit() {
//设置序列化Key的实例化对象
redisTemplate.setKeySerializer(new StringRedisSerializer());

//设置序列化Value的实例化对象
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

return redisTemplate;

}
}

一、 问题背景
最近在开发项目时,我们使用了SpringBoot集成Redis进行对象存储。然而,我们在存储对象时,出现了乱码问题,导致数据无法正常读取。经过查找资料和实践试错,终于找到了一种完美解决方案。
二、 乱码原因
在使用Redis存储对象时,对象需要通过序列化转换成字节流。而在SpringBoot默认的配置中,会对对象使用JdkSerializationRedisSerializer进行序列化。这样,对象在序列化时会转换成JDK的二进制格式,并附带一些信息头。这些信息头被存储在Redis中,导致我们读取时出现乱码。
三、 解决方案
我们可以在配置RedisTemplate的时候,指定序列化方式为Jackson2JsonRedisSerializer。这种序列化方式可以将对象序列化为JSON格式,不会带有额外的信息头,可以最大程度避免乱码问题。
四、 配置代码
在SpringBoot的配置文件中,我们需要添加以下代码:
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(60))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<>(Object.class)));
return RedisCacheManager.builder(factory).cacheDefaults(config).build();
}
五、 应用代码
在Application类中,我们可以定义一个RedisTemplate,并指定序列化方式为Jackson2JsonRedisSerializer。之后,在应用中需要存储对象时,使用这个RedisTemplate即可。
@Autowired
StringRedisTemplate redisTemplate;
User user = new User();
user.setName(\"张三\");
user.setAge(18);
user.setGender(\"男\");
redisTemplate.opsForValue().set(\"user:1\", JSON.toJSONString(user));
六、 测试结果
通过以上配置和应用代码,我们可以正常地存储对象,并能够不受乱码问题干扰地读取。
七、 总结
通过本文的分享,我们学习了SpringBoot集成Redis存对象乱码的问题,并提供了一种简单有效的解决方案。在开发过程中,我们需要根据实际情况选择序列化方式,并对序列化方式进行正确配置,以避免出现乱码问题。