当前位置:首页 > 科技  > 软件

Spring Cache 缓存注解这样用,实在是太香了!

来源: 责编: 时间:2023-11-09 09:15:10 442观看
导读作者最近在开发公司项目时使用到 Redis 缓存,并在翻看前人代码时,看到了一种关于 @Cacheable 注解的自定义缓存有效期的解决方案,感觉比较实用,因此作者自己拓展完善了一番后分享给各位。Spring 缓存常规配置Spring Cache

作者最近在开发公司项目时使用到 Redis 缓存,并在翻看前人代码时,看到了一种关于 @Cacheable 注解的自定义缓存有效期的解决方案,感觉比较实用,因此作者自己拓展完善了一番后分享给各位。Npn28资讯网——每日最新资讯28at.com

Spring 缓存常规配置

Spring Cache 框架给我们提供了 @Cacheable 注解用于缓存方法返回内容。但是 @Cacheable 注解不能定义缓存有效期。这样的话在一些需要自定义缓存有效期的场景就不太实用。Npn28资讯网——每日最新资讯28at.com

按照 Spring Cache 框架给我们提供的 RedisCacheManager 实现,只能在全局设置缓存有效期。这里给大家看一个常规的 CacheConfig 缓存配置类,代码如下,Npn28资讯网——每日最新资讯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 缓存配置做一下说明:Npn28资讯网——每日最新资讯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) 方法举例,Npn28资讯网——每日最新资讯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 名称如下,Npn28资讯网——每日最新资讯28at.com

crowd:configCache:getValueByKey_sys.nameNpn28资讯网——每日最新资讯28at.com

图片图片Npn28资讯网——每日最新资讯28at.com

TTL 过期时间是 287,跟我们全局设置的 300 秒基本是一致的。此时假如我们想把 getValueByKey 方法的缓存有效期单独设置为 600 秒,那我们该如何操作嘞?Npn28资讯网——每日最新资讯28at.com

@Cacheable 注解默认是没有提供有关缓存有效期设置的。想要单独修改 getValueByKey 方法的缓存有效期只能修改全局的缓存有效期。那么有没有别的方法能够为 getValueByKey 方法单独设置缓存有效期嘞?当然是有的,大家请往下看。Npn28资讯网——每日最新资讯28at.com

自定义 MyRedisCacheManager 缓存

其实我们可以通过自定义 MyRedisCacheManager 类继承 Spring Cache 提供的 RedisCacheManager 类后,重写 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法,代码如下,Npn28资讯网——每日最新资讯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 类逻辑如下,Npn28资讯网——每日最新资讯28at.com

  1. 继承 Spring Cache 提供的 RedisCacheManager 类。
  2. 重写 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法。
  3. 解析 name 参数,根据 # 字符串进行分割,获取缓存 key 名称以及缓存有效期。

接着我们修改下 CacheConfig 类的 cacheManager 方法用以使用 MyRedisCacheManager 类。代码如下,Npn28资讯网——每日最新资讯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,单独标识缓存有效期。代码如下,Npn28资讯网——每日最新资讯28at.com

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

看下 getValueByKey 方法生成的 Redis 缓存 key 有效期是多久。如下,Npn28资讯网——每日最新资讯28at.com

图片图片Npn28资讯网——每日最新资讯28at.com

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

本文链接:http://www.28at.com/showinfo-26-17901-0.htmlSpring Cache 缓存注解这样用,实在是太香了!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

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

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

标签:
  • 热门焦点
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top