SpringCache缓存注解

SpringCache缓存注解。小编来告诉你更多相关信息。Spring今日重点为您介绍Spring方面的知识,一定能解决您的问题的,一起来了解吧!不念最近在开发公司项目时使用到Redis缓

SpringCache缓存注解。小编来告诉你更多相关信息。

Spring

今日重点为您介绍Spring方面的知识,一定能解决您的问题的,一起来了解吧!

不念最近在开发公司项目时使用到 Redis 缓存,并在翻看前人代码时,看到了一种关于 @Cacheable 注解的自定义缓存有效期的解决方案,感觉比较实用,因此自己拓展完善了一番后分享给各位。

Spring 缓存常规配置

Spring Cache框架给我们提供了@Cacheable注解用于缓存方法返回内容。但是@Cacheable注解不能定义缓存有效期。这样的话在一些需要自定义缓存有效期的场景就不太实用。

按照 Spring Cache 框架给我们提供的 RedisCacheManager 实现,只能在全局设置缓存有效期。这里给大家看一个常规的 CacheConfig 缓存配置类,代码如下,

@EnableCaching@Configurationpublic class CacheConfig extends CachingConfigurerSupport {    ...    private RedisSerializer keySerializer() {        return new StringRedisSerializer();    }    private RedisSerializer 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缓存配置做一下说明:

  1. serializeKeysWith():设置 Redis 的 key 的序列化规则。
  2. erializeValuesWith():设置 Redis 的 value 的序列化规则。
  3. computePrefixWith():计算 Redis 的 key 前缀。
  4. entryTtl():全局设置@Cacheable注解缓存的有效期。

那么使用如上配置生成的 Redis 缓存 key 名称是什么样得嘞?这里用开源项目 crowd-admin 的 ConfigServiceImpl 类下 getValueByKey(String key) 方法举例,

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

SpringCache缓存注解。小编来告诉你更多相关信息。

Spring

执行此方法后,Redis 中缓存 key 名称如下,

crowd:configCache:getValueByKey_sys.name

SpringCache缓存注解

TTL 过期时间是 287,跟我们全局设置的 300 秒基本是一致的。此时假如我们想把getValueByKey方法的缓存有效期单独设置为 600 秒,那我们该如何操作嘞?

@Cacheable注解默认是没有提供有关缓存有效期设置的。想要单独修改getValueByKey方法的缓存有效期只能修改全局的缓存有效期。那么有没有别的方法能够为getValueByKey方法单独设置缓存有效期嘞?当然是有的,大家请往下看。

自定义 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 属性用以单独设置有效期        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 参数,根据#字符串进行分割,获取缓存 key 名称以及缓存有效期。

接着我们修改下 CacheConfig 类的 cacheManager 方法用以使用 MyRedisCacheManager 类。代码如下,

@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));}

SpringCache缓存注解。小编来告诉你更多相关信息。

Spring

最后我们修改下 @Cacheable 注解使用方式,在原有 value 属性的 configCache 值后添加 #600,单独标识缓存有效期。代码如下,

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

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

SpringCache缓存注解

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

本站部分文章来自网络或用户投稿,如无特殊说明或标注,均为本站原创发布。涉及资源下载的,本站旨在共享仅供大家学习与参考,如您想商用请获取官网版权,如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
科技百科

什么是SYNFLOOD洪水攻击(原理是什么?)

2023-11-11 0:06:30

科技百科

微信删除好友后对方还有自己吗

2023-11-11 0:07:57

搜索