1.Spring Cache 中的表达式求值(及 Spring Cache 小结)
2.④优雅的缓存框架:SpringCache之多级缓存
3.增强Spring改造@CacheEvict,支持缓存批量模糊删除!
Spring Cache 中的表达式求值(及 Spring Cache 小结)
上一章未完部分,本章重点解析Spring Cache中的表达式求值机制。Cache注解如key、unless、datax源码中presqlcondition等,支持SpEL表达式。
CacheOperationExpressionEvaluator在CacheAspectSupport中实现,其关键在于定义的ExpressionKey,实现Comparable接口,包含element和expression字段,直播室源码并配备SpelExpressionParser和DefaultParameterNameDiscoverer。
ExpressionKey类在解析过程中扮演关键角色,它从cache获取表达式,若不存在,则使用parser执行parseExpression并缓存结果。此过程需注意表达式的参数名兼容性,分别在Java 8及以下和Java 8以上版本中使用不同的ParameterNameDiscoverer。
CachedExpressionEvaluator的核心在于解析并缓存表达式,而CacheOperationExpressionEvaluator在其中扮演关键角色,它创建CacheEvaluationContext,该上下文在SpEL求值过程中提供方法参数。挖鱼源码网
CacheOperationExpressionEvaluator中提供了求值关键函数,通过生成CacheEvaluationContext以及调用generateKey等方法,结合SpEL表达式和上下文计算实际值。
总结,Spring Cache的核心源码至此解析完毕。配置由ProxyCachingConfiguration实现,解析注解则由SpringCacheAnnotationParser完成。CacheAspectSupport作为拦截类,通过CacheResolver等进行解析,结合CacheOperationExpressionEvaluator进行表达式求值,最终执行缓存操作。酷跑游戏源码
④优雅的缓存框架:SpringCache之多级缓存
多级缓存策略能够显著提升系统响应速度并减轻二级缓存压力。本文采用Redis作为二级缓存,Caffeine作为一级缓存,通过多级缓存的设计实现优化。
首先,进行多级缓存业务流程图的声明,并通过LocalCache注解对一级缓存进行管理。具体源码地址如下。
其次,自定义CaffeineRedisCache,进一步优化缓存性能。导购网站源码相关源码地址提供如下。
为了确保缓存机制的正确执行,自定义CacheResolver并将其注册为默认的cacheResolver。具体实现细节可参考以下源码链接。
在实际应用中,通过上述自定义缓存机制,能够有效地提升系统性能和用户体验。为了验证多级缓存优化效果,我们提供实战应用案例和源码。相关实战案例和源码如下链接。
实现多级缓存策略的完整源码如下:
后端代码:<a href="github.com/L1yp/van-tem...
前端代码:<a href="github.com/L1yp/van-tem...
欲加入交流群讨论更多技术内容,点击链接加入群聊: Van交流群
增强Spring改造@CacheEvict,支持缓存批量模糊删除!
在开发中,遇到一个需要批量模糊删除特定租户缓存的需求。常规的使用方式包括使用@CacheEvict注解清除指定的缓存key或全部缓存。然而,当需要按照租户的唯一TelnetID进行缓存分离时,常规的allEntries = true清空namespace下的所有元素方式已不再适用。因为这种操作将导致所有缓存数据清空,不符合需求。
为了实现批量模糊删除,需要深入理解@CacheEvict注解的实现原理。通常,@CacheEvict是通过AOP(面向切面编程)实现的,核心类是CacheAspectSupport,其内部方法负责缓存的清理。通过对CacheAspectSupport类的源码分析,我们可以发现缓存清理的逻辑主要在processCacheEvicts方法中,该方法通过调用performCacheEvict方法进行实际的缓存清理。
在processCacheEvicts方法中,performCacheEvict方法负责调用RedisCache类的evict和clear方法进行缓存清理。当allEntries为true时,调用的是clear方法,该方法以namespace:: *作为key规则进行模糊删除。这一发现为实现批量模糊删除提供了可能,我们可以通过修改evict方法,在namespace *中插入特定的TelnetID,从而实现目标。
为了实现这一需求,需要重写RedisCache类中的evict方法,并集成RedisCache。同时,为了确保定制的RedisCacheResolver生效,需要将其注入到RedisCacheManager中。这涉及定义一个自定义的RedisCacheManagerResolver类,集成RedisCacheManagerResolver实现。
在完成RedisCacheResolver的实现后,只需要在RedisConfig中管理自定义的RedisCacheManagerResolver。至此,批量模糊删除特定租户缓存的需求已得到解决。
通过以上步骤,不仅实现了使用自定义注解进行模糊删除缓存,还深入理解了Spring Cache的实现机制,进一步优化了缓存管理流程。这一技术进阶策略不仅适用于当前问题的解决,也为未来的缓存优化提供了参考。
2024-12-22 13:31
2024-12-22 12:48
2024-12-22 12:27
2024-12-22 12:27
2024-12-22 12:09
2024-12-22 11:43