千家信息网

SpringBoot集成Redis引起的序列化问题怎么解决

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要讲解了"SpringBoot集成Redis引起的序列化问题怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SpringBoot集成R
千家信息网最后更新 2025年01月31日SpringBoot集成Redis引起的序列化问题怎么解决

这篇文章主要讲解了"SpringBoot集成Redis引起的序列化问题怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SpringBoot集成Redis引起的序列化问题怎么解决"吧!

想必大家对SpringBoot可能已经很熟悉了,包括集成Redis这种常用的技术,之前一直用一贯的写法去集成Redis,写配置类没发现过任何问题,但是上周在给Redis配置类加了一个Bean之后就出现了很难发现的问题。

配置类代码 `@Configuration public class RedisConfig extends CachingConfigurerSupport {

[@Bean](https://my.oschina.net/bean)public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {    RedisTemplate redisTemplate = new RedisTemplate<>();    redisTemplate.setConnectionFactory(redisConnectionFactory);    // 使用Jackson2JsonRedisSerialize 替换默认序列化    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);    ObjectMapper objectMapper = new ObjectMapper();    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);    objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);    // 设置value的序列化规则和 key的序列化规则    redisTemplate.setKeySerializer(new StringRedisSerializer());    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);    redisTemplate.setHashKeySerializer(new StringRedisSerializer());    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);    redisTemplate.afterPropertiesSet();    return redisTemplate;}[@Bean](https://my.oschina.net/bean)public CacheManager cacheManager(RedisConnectionFactory factory) {    RedisSerializer redisSerializer = new StringRedisSerializer();    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);    //解决查询缓存转换异常的问题    ObjectMapper om = new ObjectMapper();    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);    jackson2JsonRedisSerializer.setObjectMapper(om);    // 配置序列化(解决乱码的问题),过期时间30秒    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()            .entryTtl(Duration.ofSeconds(1800000))            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))            .disableCachingNullValues();    RedisCacheManager cacheManager = RedisCacheManager.builder(factory)            .cacheDefaults(config)            .build();    return cacheManager;}

}` 也就是增加了cacheManager()这个方法之后,数据量小的时候是没有任何问题的,但是一旦放到线上,数据量一上来,那么整个Redis就导致内存溢出,整个服务都会挂掉。

错误日志: org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.lang.OutOfMemoryError: Java heap space at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:84) ~[spring-data-redis-2.1.6.RELEASE.jar!/:2.1.6.RELEASE] at org.springframework.session.data.redis.RedisOperationsSessionRepository.onMessage(RedisOperationsSessionRepository.java:538) ~[spring-session-data-redis-2.1.5.RELEASE.jar!/:2.1.5.RELEASE] at org.springframework.data.redis.listener.RedisMessageListenerContainer.executeListener(RedisMessageListenerContainer.java:250) [spring-data-redis-2.1.6.RELEASE.jar!/:2.1.6.RELEASE] at org.springframework.data.redis.listener.RedisMessageListenerContainer.processMessage(RedisMessageListenerContainer.java:240) [spring-data-redis-2.1.6.RELEASE.jar!/:2.1.6.RELEASE] at org.springframework.data.redis.listener.RedisMessageListenerContainer.lambda$dispatchMessage$0(RedisMessageListenerContainer.java:986) [spring-data-redis-2.1.6.RELEASE.jar!/:2.1.6.RELEASE] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_191] Caused by: org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.lang.OutOfMemoryError: Java heap space at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:78) ~[spring-core-5.1.6.RELEASE.jar!/:5.1.6.RELEASE] at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:36) ~[spring-core-5.1.6.RELEASE.jar!/:5.1.6.RELEASE] at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:82) ~[spring-data-redis-2.1.6.RELEASE.jar!/:2.1.6.RELEASE] ... 5 common frames omitted Caused by: java.lang.OutOfMemoryError: Java heap space

至于为什么注入这个bean之后会出现这个问题,去了这个bean之后,不会再出现这个问题,目前我还没找到原因,分享出来大家一起参考,避免在网上找的配置应用在自己的代码中出现问题,也欢迎踩过坑的朋友来解答。

感谢各位的阅读,以上就是"SpringBoot集成Redis引起的序列化问题怎么解决"的内容了,经过本文的学习后,相信大家对SpringBoot集成Redis引起的序列化问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

问题 序列 配置 学习 代码 内容 数据 规则 也就是 乱码 内存 写法 原因 就是 常用 思路 情况 技术 文章 方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 计算机网络技术怎样发展 icloud连接到服务器时出现问题 服务器 负载量 香港云服务器免费备案 超市软件开发语言 德阳一手楼盘销售软件开发 网络安全的需求分析报告 福建淘汽互联网科技 关于网络安全传递网络正能量 电脑连校园网无法连接认证服务器 辽宁大连软件开发报价 学校网络安全宣传周的目的和意义 2021年网络安全宣传周学习 网络安全商业渗透测试 高血压影响入职软件开发吗 互联网金融科技服务商 从大学生角度谈网络安全问题论文 网络安全与执法是啥专业 饥荒联机版报错掉出服务器 新加坡网络安全教学 南阳市公安局网络安全大队 抖音直播网络技术 帝国神话自己开服务器卡 深信服一体机服务器是什么 窗体是数据库与用户进行 数据库结束当前语句 成都心悦家传软件开发 中欧网络安全法律原则与体系 全景云图网络技术有限公司 香格里拉会谈网络安全
0