溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot集成Redis引起的序列化問題怎么解決

發(fā)布時(shí)間:2021-06-28 15:26:01 來源:億速云 閱讀:600 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“SpringBoot集成Redis引起的序列化問題怎么解決”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“SpringBoot集成Redis引起的序列化問題怎么解決”吧!

想必大家對SpringBoot可能已經(jīng)很熟悉了,包括集成Redis這種常用的技術(shù),之前一直用一貫的寫法去集成Redis,寫配置類沒發(fā)現(xiàn)過任何問題,但是上周在給Redis配置類加了一個(gè)Bean之后就出現(xiàn)了很難發(fā)現(xiàn)的問題。

配置類代碼 `@Configuration public class RedisConfig extends CachingConfigurerSupport {

[@Bean](https://my.oschina.net/bean)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory);

    // 使用Jackson2JsonRedisSerialize 替換默認(rèn)序列化
    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);

    // 設(shè)置value的序列化規(guī)則和 key的序列化規(guī)則
    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<String> redisSerializer = new StringRedisSerializer();
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

    //解決查詢緩存轉(zhuǎn)換異常的問題
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);

    // 配置序列化(解決亂碼的問題),過期時(shí)間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()這個(gè)方法之后,數(shù)據(jù)量小的時(shí)候是沒有任何問題的,但是一旦放到線上,數(shù)據(jù)量一上來,那么整個(gè)Redis就導(dǎo)致內(nèi)存溢出,整個(gè)服務(wù)都會(huì)掛掉。

錯(cuò)誤日志: 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

至于為什么注入這個(gè)bean之后會(huì)出現(xiàn)這個(gè)問題,去了這個(gè)bean之后,不會(huì)再出現(xiàn)這個(gè)問題,目前我還沒找到原因,分享出來大家一起參考,避免在網(wǎng)上找的配置應(yīng)用在自己的代碼中出現(xiàn)問題,也歡迎踩過坑的朋友來解答。

感謝各位的閱讀,以上就是“SpringBoot集成Redis引起的序列化問題怎么解決”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對SpringBoot集成Redis引起的序列化問題怎么解決這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI