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

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

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

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

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

Spring 緩存常規配置

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

按照 Spring Cache 框架給我們提供的 RedisCacheManager 實現,只能在全局設置緩存有效期。這里給大家看一個常規的 CacheConfig 緩存配置類,代碼如下,uyA28資訊網——每日最新資訊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 緩存配置做一下說明:uyA28資訊網——每日最新資訊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) 方法舉例,uyA28資訊網——每日最新資訊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 名稱如下,uyA28資訊網——每日最新資訊28at.com

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

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

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

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

自定義 MyRedisCacheManager 緩存

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

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

接著我們修改下 CacheConfig 類的 cacheManager 方法用以使用 MyRedisCacheManager 類。代碼如下,uyA28資訊網——每日最新資訊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,單獨標識緩存有效期。代碼如下,uyA28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 大兴区| 綦江县| 赤水市| 临武县| 陇南市| 娱乐| 根河市| 吉安县| 绥宁县| 丰县| 舟曲县| 灌云县| 肥城市| 镇宁| 洛扎县| 广河县| 枝江市| 内乡县| 鄂伦春自治旗| 鄯善县| 永福县| 保定市| 通城县| 手游| 平和县| 讷河市| 潮安县| 当阳市| 平舆县| 东平县| 本溪市| 甘洛县| 德阳市| 阆中市| 齐齐哈尔市| 东安县| 浦江县| 新蔡县| 济源市| 高邑县| 台湾省|