成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 前端
Spring Cache? 框架給我們提供了 @Cacheable? 注解用于緩存方法返回內(nèi)容。但是 @Cacheable 注解不能定義緩存有效期。這樣的話在一些需要自定義緩存有效期的場景就不太實用。

作者最近在開發(fā)公司項目時使用到 Redis 緩存,并在翻看前人代碼時,看到了一種關(guān)于 @Cacheable 注解的自定義緩存有效期的解決方案,感覺比較實用,因此作者自己拓展完善了一番后分享給各位。

Spring 緩存常規(guī)配置

Spring Cache 框架給我們提供了 @Cacheable 注解用于緩存方法返回內(nèi)容。但是 @Cacheable 注解不能定義緩存有效期。這樣的話在一些需要自定義緩存有效期的場景就不太實用。

按照 Spring Cache 框架給我們提供的 RedisCacheManager 實現(xiàn),只能在全局設(shè)置緩存有效期。這里給大家看一個常規(guī)的 CacheConfig 緩存配置類,代碼如下,

@EnableCaching
@Configuration
public 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()
                //設(shè)置key為String
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
                //設(shè)置value為自動轉(zhuǎn)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 緩存配置做一下說明:

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

那么使用如上配置生成的 Redis 緩存 key 名稱是什么樣得嘞?這里用開源項目 crowd-admin 的 ConfigServiceImpl 類下 getValueByKey(String key) 方法舉例,

@Cacheable(value = "configCache", key = "#root.methodName + '_' + #root.args[0]")
@Override
public 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();
}

執(zhí)行此方法后,Redis 中緩存 key 名稱如下,

crowd:configCache:getValueByKey_sys.name

圖片圖片

TTL 過期時間是 287,跟我們?nèi)衷O(shè)置的 300 秒基本是一致的。此時假如我們想把 getValueByKey 方法的緩存有效期單獨設(shè)置為 600 秒,那我們該如何操作嘞?

@Cacheable 注解默認是沒有提供有關(guān)緩存有效期設(shè)置的。想要單獨修改 getValueByKey 方法的緩存有效期只能修改全局的緩存有效期。那么有沒有別的方法能夠為 getValueByKey 方法單獨設(shè)置緩存有效期嘞?當然是有的,大家請往下看。

自定義 MyRedisCacheManager 緩存

其實我們可以通過自定義 MyRedisCacheManager 類繼承 Spring Cache 提供的 RedisCacheManager 類后,重寫 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法,代碼如下,

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 屬性用以單獨設(shè)置有效期
        if (array.length > 1) {
            long ttl = Long.parseLong(array[1]);
            cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(ttl));
        }
        return super.createRedisCache(name, cacheConfig);
    }
}

MyRedisCacheManager 類邏輯如下,

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

接著我們修改下 CacheConfig 類的 cacheManager 方法用以使用 MyRedisCacheManager 類。代碼如下,

@Bean
public 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,單獨標識緩存有效期。代碼如下,

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

看下 getValueByKey 方法生成的 Redis 緩存 key 有效期是多久。如下,

圖片圖片

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

責(zé)任編輯:武曉燕 來源: waynblog
相關(guān)推薦

2020-10-10 11:07:38

Java開發(fā)代碼

2024-01-05 13:26:00

KafkaTopicSpring

2024-01-26 07:48:10

SpringKafka提升

2020-12-21 07:36:15

緩存數(shù)據(jù)庫緩存層

2020-09-09 09:55:36

JavaNIOBIO

2025-04-25 08:11:29

2021-12-03 10:46:49

ELKGraylog運維

2021-12-02 06:34:34

GraylogELK日志

2021-08-02 19:18:32

Redis緩存高并發(fā)

2023-11-07 10:36:37

2021-07-28 14:20:13

正則PythonFlashText

2021-06-29 19:26:29

緩存Spring CachSpring

2023-05-05 18:38:33

多級緩存Caffeine開發(fā)

2023-10-30 07:56:46

Spring緩存

2020-03-23 08:30:12

程序員男友感受

2025-02-05 14:28:19

2023-11-13 22:47:58

PythonPathlib

2025-01-09 11:24:59

線程池美團動態(tài)配置中心

2021-12-15 10:01:06

Python進度條開發(fā)

2024-08-09 08:55:43

if執(zhí)行器版本
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品激情 | av免费网址| 天天干天天爱天天操 | 亚洲免费在线 | 在线观看a视频 | 午夜影晥| 午夜视频在线观看网站 | 亚洲精品乱码久久久久久久久久 | 日本手机在线 | 亚洲三区在线观看 | 日韩精品成人免费观看视频 | 日韩综合一区 | 日韩精品| 久久99精品久久久 | 成人一区二区三区在线观看 | 密色视频| 不卡一区二区三区四区 | 久久99视频精品 | 久久精品男人的天堂 | 天天综合网天天综合 | 国产95在线| 亚洲欧美在线观看 | 99精品国自产在线 | 97日日碰人人模人人澡分享吧 | 日韩精品四区 | 自拍视频精品 | 免费视频二区 | www国产亚洲精品久久网站 | 在线国产视频观看 | 久久高清免费视频 | 91精品一区二区三区久久久久 | 91九色婷婷 | 美女视频h | 国产欧美精品区一区二区三区 | 夜夜夜操| 国产一级片免费视频 | 精品日韩一区二区 | 国产日产精品一区二区三区四区 | 精品一二区| 国产福利在线 | 国产乱码精品一区二区三区五月婷 |