日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Spring Cache 緩存注解這樣用,實在是太香了!

來源: 責編: 時間:2023-11-09 09:15:10 332觀看
導讀作者最近在開發公司項目時使用到 Redis 緩存,并在翻看前人代碼時,看到了一種關于 @Cacheable 注解的自定義緩存有效期的解決方案,感覺比較實用,因此作者自己拓展完善了一番后分享給各位。Spring 緩存常規配置Spring Cache

作者最近在開發公司項目時使用到 Redis 緩存,并在翻看前人代碼時,看到了一種關于 @Cacheable 注解的自定義緩存有效期的解決方案,感覺比較實用,因此作者自己拓展完善了一番后分享給各位。C0028資訊網——每日最新資訊28at.com

Spring 緩存常規配置

Spring Cache 框架給我們提供了 @Cacheable 注解用于緩存方法返回內容。但是 @Cacheable 注解不能定義緩存有效期。這樣的話在一些需要自定義緩存有效期的場景就不太實用。C0028資訊網——每日最新資訊28at.com

按照 Spring Cache 框架給我們提供的 RedisCacheManager 實現,只能在全局設置緩存有效期。這里給大家看一個常規的 CacheConfig 緩存配置類,代碼如下,C0028資訊網——每日最新資訊28at.com

@EnableCaching@Configurationpublic class CacheConfig extends CachingConfigurerSupport {    ...    private RedisSerializer<String> keySerializer() {        return new StringRedisSerializer();    }    private RedisSerializer<Object> valueSerializer() {        return new GenericFastJsonRedisSerializer();    }    public static final String CACHE_PREFIX = "crowd:";    @Bean    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {        // 配置序列化(解決亂碼的問題)        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                //設置key為String                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))                //設置value為自動轉Json的Object                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))                .computePrefixWith(name -> CACHE_PREFIX + name  + ":")                .entryTtl(Duration.ofSeconds(600));        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisConnectionFactory));        return new RedisCacheManager(redisCacheWriter, config);    }}

這里面簡單對 RedisCacheConfiguration 緩存配置做一下說明:C0028資訊網——每日最新資訊28at.com

  1. serializeKeysWith():設置 Redis 的 key 的序列化規則。
  2. erializeValuesWith():設置 Redis 的 value 的序列化規則。
  3. computePrefixWith():計算 Redis 的 key 前綴。
  4. entryTtl():全局設置 @Cacheable 注解緩存的有效期。

那么使用如上配置生成的 Redis 緩存 key 名稱是什么樣得嘞?這里用開源項目 crowd-admin 的 ConfigServiceImpl 類下 getValueByKey(String key) 方法舉例,C0028資訊網——每日最新資訊28at.com

@Cacheable(value = "configCache", key = "#root.methodName + '_' + #root.args[0]")@Overridepublic String getValueByKey(String key) {    QueryWrapper<Config> wrapper = new QueryWrapper<>();    wrapper.eq("configKey", key);    Config config = getOne(wrapper);    if (config == null) {        return null;    }    return config.getConfigValue();}

執行此方法后,Redis 中緩存 key 名稱如下,C0028資訊網——每日最新資訊28at.com

crowd:configCache:getValueByKey_sys.nameC0028資訊網——每日最新資訊28at.com

圖片圖片C0028資訊網——每日最新資訊28at.com

TTL 過期時間是 287,跟我們全局設置的 300 秒基本是一致的。此時假如我們想把 getValueByKey 方法的緩存有效期單獨設置為 600 秒,那我們該如何操作嘞?C0028資訊網——每日最新資訊28at.com

@Cacheable 注解默認是沒有提供有關緩存有效期設置的。想要單獨修改 getValueByKey 方法的緩存有效期只能修改全局的緩存有效期。那么有沒有別的方法能夠為 getValueByKey 方法單獨設置緩存有效期嘞?當然是有的,大家請往下看。C0028資訊網——每日最新資訊28at.com

自定義 MyRedisCacheManager 緩存

其實我們可以通過自定義 MyRedisCacheManager 類繼承 Spring Cache 提供的 RedisCacheManager 類后,重寫 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法,代碼如下,C0028資訊網——每日最新資訊28at.com

public class MyRedisCacheManager extends RedisCacheManager {    public MyRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {        super(cacheWriter, defaultCacheConfiguration);    }    @Override    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {        String[] array = StringUtils.split(name, "#");        name = array[0];         // 解析 @Cacheable 注解的 value 屬性用以單獨設置有效期        if (array.length > 1) {            long ttl = Long.parseLong(array[1]);            cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(ttl));        }        return super.createRedisCache(name, cacheConfig);    }}

MyRedisCacheManager 類邏輯如下,C0028資訊網——每日最新資訊28at.com

  1. 繼承 Spring Cache 提供的 RedisCacheManager 類。
  2. 重寫 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法。
  3. 解析 name 參數,根據 # 字符串進行分割,獲取緩存 key 名稱以及緩存有效期。

接著我們修改下 CacheConfig 類的 cacheManager 方法用以使用 MyRedisCacheManager 類。代碼如下,C0028資訊網——每日最新資訊28at.com

@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {    return new MyRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), defaultCacheConfig());}private RedisCacheConfiguration defaultCacheConfig() {    return RedisCacheConfiguration.defaultCacheConfig()            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))            .computePrefixWith(name -> CACHE_PREFIX + name  + ":")            .entryTtl(Duration.ofSeconds(600));}

最后我們修改下 @Cacheable 注解使用方式,在原有 value 屬性的 configCache 值后添加 #600,單獨標識緩存有效期。代碼如下,C0028資訊網——每日最新資訊28at.com

@Cacheable(value = "configCache#600", key = "#root.methodName + '_' + #root.args[0]")@Overridepublic String getValueByKey(String key) {   ...}

看下 getValueByKey 方法生成的 Redis 緩存 key 有效期是多久。如下,C0028資訊網——每日最新資訊28at.com

圖片圖片C0028資訊網——每日最新資訊28at.com

OK,看到是 590 秒有效期后,我們就大功告成了,希望本文能對大家有所幫助

本文鏈接:http://www.www897cc.com/showinfo-26-17901-0.htmlSpring Cache 緩存注解這樣用,實在是太香了!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: IntelliJ IDEA 一些不為人知的功能

下一篇: Istio流量管理之請求路由分析

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 永宁县| 绥江县| 杨浦区| 嘉禾县| 蒙城县| 莲花县| 辰溪县| 广昌县| 固阳县| 凭祥市| 英山县| 开鲁县| 陆丰市| 内丘县| 建始县| 铜川市| 武夷山市| 普兰县| 邯郸县| 霞浦县| 福鼎市| 西林县| 日土县| 开远市| 梁河县| 炉霍县| 彭山县| 云浮市| 江西省| 朔州市| 同江市| 宣城市| 华池县| 荔波县| 江陵县| 九台市| 乌恰县| 修武县| 新竹市| 顺昌县| 南雄市|