千家信息网

spring缓存自定义resolver的方法怎么用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"spring缓存自定义resolver的方法怎么用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能
千家信息网最后更新 2026年11月01日spring缓存自定义resolver的方法怎么用

本篇内容介绍了"spring缓存自定义resolver的方法怎么用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、概述

cache-aside模式是常用的缓存使用模式。

使用流程如下图:

当更新数据库中的数据后,对缓存做失效处理,后续就能读取到数据库中最新的数据,使得缓存数据与数据库数据保持一致。

在spring中通过cache注解进行缓存的处理,一般会把缓存处理封装到dao层,这样业务层就不需要感知缓存操作的细节,可以专注于业务逻辑的处理。

二、缓存的读取和失效

dao层的操作通常使用springdatajpa,数据库方法都是一个interface,通过在interface上增加对应的cache注解实现缓存处理。

读取数据:

@Cacheable(value = "testCache", key = "#p0", unless = "#result == null")Optional findById(Long id);

通过Cacheable注解,从数据库中读取到数据后,会同步写到缓存中。

保存数据:

@CacheEvict(value = "testCache", key = "#p0.id")DemoEntity save(DemoEntity entity);

通过CacheEvict注解,在将数据写入到数据库后,对缓存进行失效。

如果我们想在缓存失效后,进行其它的操作,例如将失效缓存的key写入kafka,用于其它系统同步删除缓存,这时该怎样处理?

三、自定义缓存resolver

spring提供了自定义缓存resolver的方式,通过自定义resolver,可以在缓存处理中增加附加操作。

@Configurationpublic class RedisCacheConfig extends CachingConfigurerSupport {    @Bean    public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()                .computePrefixWith(cacheName -> cacheName.concat(":"));        return RedisCacheManager.builder(redisConnectionFactory)                .cacheDefaults(cacheConfiguration)                .build();    }    @Bean    public CacheResolver customCacheResolver(RedisConnectionFactory redisConnectionFactory) {        return new CustomCacheResolver(redisCacheManager(redisConnectionFactory));    }}

以上代码是redis缓存的配置,其中 RedisCacheManager部分是常规的cacheManager的配置, 而 customCacheResolver部分是自定义resolver的配置,通过定义customCacheResolver这个bean,可以在cache注解中引用到这个自定义的resolver。

定义好customCacheResolver的bean后,我们就可以在cache注解中引用,上面提到的数据保存方法改造后的代码:

@CacheEvict(value = "testCache", cacheResolver = "customCacheResolver", key = "#p0.id")DemoEntity save(DemoEntity entity);

相比于之前的实现,对CacheEvict增加指定cacheResolver。

四、自定义resolver的实现

上面我们介绍了如果配置和引用cacheResolver,下面介绍自定义cacheResolver的实现。

public class CustomCacheResolver extends SimpleCacheResolver {    public CustomCacheResolver(CacheManager cacheManager) {        super(cacheManager);    }    @Override    @NonNull    public Collection resolveCaches(CacheOperationInvocationContext context) {        ParameterNameDiscoverer paramNameDiscoverer = new DefaultParameterNameDiscoverer();        EvaluationContext evaluationContext = new MethodBasedEvaluationContext(context.getOperation(), context.getMethod(), context.getArgs(), paramNameDiscoverer);        Expression exp = (new SpelExpressionParser()).parse_Expression(((CacheEvictOperation) context.getOperation()).getKey());        Collection caches = super.resolveCaches(context);        context.getOperation().getCacheNames().forEach(cacheName -> {            String key = cacheName + ':' + exp.getValue(evaluationContext, String.class);            log.info("cache key={}", key);        });        return caches;    }}

上面的代码定义了CustomCacheResolver这个自定义resolver类,继承SimpleCacheResolver。SimpleCacheResolver类是spring在cache注解中默认使用的resolver。

我们通过扩展SimpleCacheResolver这个类,来增加附加操作。其中resolveCaches就是解析缓存操作的部分。

在这部分代码中,我们需要的是获取到 @CacheEvict(value = "testCache", cacheResolver = "customCacheResolver", key = "#p0.id")注解中失效的缓存的key的值。

通过 context.getOperation()).getKey()从参数context中可以读取到key的定义,即 #p0.id,这个定义是一个spel表达式,与普通的spel表达式不同, p0这个变量是jpa方法中的一个特有变量,表示方法中的第一个参数,同样p1表示方法中的第二个参数。通过普通的spel处理无法解析这个spel表达式。
spring提供了 MethodBasedEvaluationContext类用于解析这种特殊的spel表达式。

通过一下四行代码,我们就能够获取到具体的key的值:

ParameterNameDiscoverer paramNameDiscoverer = new DefaultParameterNameDiscoverer();EvaluationContext evaluationContext = new MethodBasedEvaluationContext(context.getOperation(), context.getMethod(), context.getArgs(), paramNameDiscoverer);Expression exp = (new SpelExpressionParser()).parse_Expression(((CacheEvictOperation) context.getOperation()).getKey());String key = cacheName + ':' + exp.getValue(evaluationContext, String.class);

获取到了key的值,我们就可以对这个key做很多操作,可以把这个key写入kafka,通知其它系统同步清理key。

"spring缓存自定义resolver的方法怎么用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

缓存 数据 注解 处理 方法 数据库 代码 表达式 配置 参数 部分 普通 业务 内容 变量 更多 模式 知识 系统 同步 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手磨咖啡 互联网科技活动banner 互联网金融监管科技数据 华中科技大学互联网 苏州互联网科技贷款公司 壕鑫互联网络科技 美国互联网黑科技 互联网科技公司有哪些 互联网科技素材视频竖屏 互联网公司会议桌创意科技软装饰 互联网科技产品 为客找房互联网科技公司怎么样 互联网时代的科技公司 山东子淼互联网科技有限公司 互联网金融科技公司的优势 广州梦谷互联网科技有限公司领导 普陀区互联网教育科技管理办法 互联网高科技行业有哪些企业 绵阳真晨互联网科技有限公司 陕西彩京云互联网科技有限公司 互联网科技工作委员会 互联网下的科技发展 华宇互联网科技 互联网科技教育视频 厦门比较好的科技互联网公司 黑科技闪耀互联网之光 徐州市互联网科技有限公司 互联网科技实习生岗位 第三届互联网大会安防黑科技 青岛易易互联网科技
0