聊聊如何基于spring @Cacheable扩展实现缓存自动过期时间以及自动刷新
前言
用过spring cache的朋友应该会知道,Spring Cache默认是不支持在@Cacheable上添加过期时间的,虽然可以通过配置缓存容器时统一指定。形如
但有时候我们会更习惯通过注解指定过期时间。今天我们就来聊一下如何扩展@Cacheable实现缓存自动过期以及缓存即将到期自动刷新
2
实现注解缓存过期前置知识
SpringCache包含两个顶级接口,Cache和CacheManager,通过CacheManager可以去管理一堆Cache。因此我们要扩展@Cacheable,就脱离不了对Cache和CacheManager进行扩展
其次要实现过期时间,首先是引入的缓存产品,他本身就要支持过期时间,比如引入的缓存为ConcurrentHashMap,他原本就是不支持过期时间,如果要扩展,就要非常耗费精力实现
3
实现注解缓存过期
01
方法一:通过自定义cacheNames方式
形如下
通过#分隔,#后面部分代表过期时间(单位为秒)
实现逻辑步骤为:
1、自定义缓存管理器并继承RedisCacheManager,同时重写createRedisCache方法
示例:
2、将默认的缓存管理器改成我们自定义的缓存管理器
示例:
通过如上2个步骤,即可实现缓存过期
02
方法二:通过自定义派生@Cacheable注解
第一种方法的实现是简单,但缺点是语义不直观,因此得做好宣导以及wiki,不然对于新人来说,他可能都不知道cacheName用#分割是代表啥意思
方法二的实现逻辑步骤如下
1、自定义注解LybGeekCacheable
大部分注解和@Cacheable保持一致,新增expiredTimeSecond缓存过期时间以及缓存自动刷新时间preLoadTimeSecond
2、自定义缓存管理器并继承RedisCacheManager并重写loadCaches和createRedisCache
3、在spring bean初始化完成后,设置缓存过期时间,并重新初始化缓存。
注: 为啥要重新初始化缓存,主要是为了一开始默认的是没设置缓存过期,重新初始化是为了设置过期时间。为啥调用initializeCaches()这个方法,看下官方描述就知道了
他就是在运行的时候,可以重新初始化缓存
4、将默认的缓存管理器改成我们自定义的缓存管理器
5、测试