欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot集成@Cacheable緩存亂碼的問題解決

 更新時間:2025年10月27日 10:36:49   作者:No8g攻城獅  
本文介紹了Springboot應(yīng)用中遇到的Redis緩存數(shù)據(jù)亂碼問題及其解決方案,問題出現(xiàn)在使用@Cacheable注解后,Redis中的value顯示為亂碼,下面就來詳細的介紹一下該問題的解決,感興趣的可以了解一下

一、問題及現(xiàn)象

會把被標注的方法的返回值緩存到 Redis 中,相同的操作不會查數(shù)據(jù)庫而是從緩存中獲取數(shù)據(jù)。

Springboot 集成 Redis,使用 @Cacheable 注解之后,把數(shù)據(jù)緩存到 Redis 中,數(shù)據(jù)是保存在Redis 中了,但是,通過 Redis 的可視化管理工具查看緩存的數(shù)據(jù)時,卻發(fā)現(xiàn) redis 中的 key 正常,但是 value 是亂碼。如下圖所示的亂碼:

修改過后,可以正常顯示,如下圖:

二、原因分析

其實出現(xiàn)上述亂碼,一般情況都是沒有配置 redis 序列化值導(dǎo)致的,而源碼里的配置又沒有默認,需要自己去實現(xiàn)。

在網(wǎng)上有很多種寫法,我搜索了很多都不適合自己,只有下面這一種可以正常。

三、解決方案

添加一個 Redis 的配置類即可。如下代碼是我在項目中的代碼,加上重啟項目 Redis 緩存中的 value 即可正常顯示。

package com.iot.back.message.process.config;

import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

/**
 * <p>RedisConfig 此類用于:Redis相關(guān)配置,用于解決存入Redis中值亂碼問題 </p>
 * <p>@author:hujm</p>
 * <p>@date:2022年08月18日 18:04</p>
 * <p>@remark:</p>
 */
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {

        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();

        // 序列化值
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair
                .fromSerializer(new GenericJackson2JsonRedisSerializer()));

        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }

        return config;
    }
}

使用 @Cacheable 注解的類

package com.iot.back.message.process.rpc;

import com.iot.back.message.process.convert.DeviceBasicInfoConvert;
import com.iot.back.message.process.dto.DeviceBasicInfoDTO;
import com.iot.basic.iotsmarthome.api.client.device.DeviceCloudClient;
import com.iot.basic.iotsmarthome.api.response.device.DeviceBasicInfoResponse;
import com.iot.framework.core.response.CommResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * <p>DeviceBasicInfoRpc 此類用于:設(shè)備基本信息遠程調(diào)用 </p>
 * <p>@author:hujm</p>
 * <p>@date:2022年05月23日 15:07</p>
 * <p>@remark:</p>
 */
@Slf4j
@Component
public class DeviceBasicInfoRpc {

    @Resource
    private DeviceCloudClient deviceCloudClient;

    @Cacheable(cacheNames = "back-process-service:cache", key = "#sn+':'+#deviceId", sync = true)
    public DeviceBasicInfoDTO getDeviceBasicInfo(String sn, Integer deviceId) {

        CommResponse<DeviceBasicInfoResponse> deviceBasicInfoCommResponse = deviceCloudClient.getDeviceBasicInfo(sn, deviceId);

        if (deviceBasicInfoCommResponse == null || deviceBasicInfoCommResponse.isFail()) {
            log.error("P0|DeviceBasicInfoRpc|getDeviceBasicInfo|調(diào)用設(shè)備云服務(wù)時,根據(jù)sn和deviceId獲取設(shè)備基礎(chǔ)信息失??!");
            return null;
        }

        DeviceBasicInfoResponse deviceBasicInfoResponse = deviceBasicInfoCommResponse.getData();

        return DeviceBasicInfoConvert.INSTANCE.convert2DeviceBasicInfoDTO(deviceBasicInfoResponse);
    }
}

到此這篇關(guān)于springboot集成@Cacheable緩存亂碼的問題解決的文章就介紹到這了,更多相關(guān)springboot集成@Cacheable緩存亂碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring?boot項目使用@Async注解的坑

    spring?boot項目使用@Async注解的坑

    這篇文章主要為大家介紹了spring?boot項目中使用@Async注解遇到的坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Hutool開發(fā)利器MapProxy類使用技巧詳解

    Hutool開發(fā)利器MapProxy類使用技巧詳解

    這篇文章主要為大家介紹了Hutool開發(fā)利器MapProxy類使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • swagger的請求參數(shù)不顯示,@Apimodel的坑點及解決

    swagger的請求參數(shù)不顯示,@Apimodel的坑點及解決

    這篇文章主要介紹了swagger的請求參數(shù)不顯示,@Apimodel的坑點及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式

    java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式

    這篇文章主要介紹了java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java等待喚醒機制原理實例解析

    Java等待喚醒機制原理實例解析

    這篇文章主要介紹了Java等待喚醒機制原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-01-01
  • IDEA配置和啟動maven項目詳細步驟

    IDEA配置和啟動maven項目詳細步驟

    本文介紹了從SVN檢出Web項目并進行Maven化、JDK和項目結(jié)構(gòu)配置、Spring和Tomcat環(huán)境搭建的詳細步驟,幫助讀者順利完成Java Web項目的開發(fā)環(huán)境搭建
    2025-10-10
  • Java SpringBoot+vue+實戰(zhàn)項目詳解

    Java SpringBoot+vue+實戰(zhàn)項目詳解

    這篇文章主要介紹了SpringBoot+VUE實現(xiàn)前后端分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2021-09-09
  • 詳解JAVA設(shè)計模式之模板模式

    詳解JAVA設(shè)計模式之模板模式

    這篇文章主要介紹了詳解JAVA設(shè)計模式之模板模式的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習,感興趣的朋友可以了解下
    2020-06-06
  • Java使用位運算實現(xiàn)權(quán)限管理的示例詳解

    Java使用位運算實現(xiàn)權(quán)限管理的示例詳解

    在開發(fā)中,權(quán)限管理是一個非常常見的需求,本文將詳細講解如何使用 Java 中的 位運算 實現(xiàn)一個輕量級、高效的權(quán)限管理系統(tǒng),并提供完整的代碼示例和解釋,感興趣的小伙伴可以了解下
    2025-06-06
  • 一文掌握Java開發(fā)工具Maven(簡單上手)

    一文掌握Java開發(fā)工具Maven(簡單上手)

    掌握maven的相關(guān)知識是Java開發(fā)必備的技能,今天通過本文從入門安裝開始,逐步深入講解maven的相關(guān)知識,包括maven的安裝到簡單上手maven項目開發(fā),感興趣的朋友跟隨小編一起看看吧
    2021-06-06

最新評論