作者最近在开发公司项目时使用到 Redis 缓存,并在翻看前人代码时,看到了一种关于 @Cacheable 注解的自定义缓存有效期的解决方案,感觉比较实用,因此作者自己拓展完善了一番后分享给各位。
创新互联是一家集网站建设,商洛企业网站建设,商洛品牌网站建设,网站定制,商洛网站建设报价,网络营销,网络优化,商洛网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
Spring Cache 框架给我们提供了 @Cacheable 注解用于缓存方法返回内容。但是 @Cacheable 注解不能定义缓存有效期。这样的话在一些需要自定义缓存有效期的场景就不太实用。
按照 Spring Cache 框架给我们提供的 RedisCacheManager 实现,只能在全局设置缓存有效期。这里给大家看一个常规的 CacheConfig 缓存配置类,代码如下,
@EnableCaching @Configuration public 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 缓存配置做一下说明: serializeKeysWith():设置 Redis 的 key 的序列化规则。erializeValuesWith():设置 Redis 的 value 的序列化规则。computePrefixWith():计算 Redis 的 key 前缀。entryTtl():全局设置 @Cacheable 注解缓存的有效期。那么使用如上配置生成的 Redis 缓存 key 名称是什么样得嘞?这里用开源项目 crowd-admin 的 ConfigServiceImpl 类下 getValueByKey(String key) 方法举例,@Cacheable(value = "configCache", key = "#root.methodName + '_' + #root.args[0]") @Override public String getValueByKey(String key) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("configKey", key); Config config = getOne(wrapper); if (config == null) { return null; } return config.getConfigValue(); }执行此方法后,Redis 中缓存 key 名称如下, crowd:configCache:getValueByKey_sys.name图片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 类逻辑如下, 继承 Spring Cache 提供的 RedisCacheManager 类。重写 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法。解析 name 参数,根据 # 字符串进行分割,获取缓存 key 名称以及缓存有效期。接着我们修改下 CacheConfig 类的 cacheManager 方法用以使用 MyRedisCacheManager 类。代码如下,@Bean public 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,单独标识缓存有效期。代码如下,@Cacheable(value = "configCache#600", key = "#root.methodName + '_' + #root.args[0]") @Override public String getValueByKey(String key) { ... }看下 getValueByKey 方法生成的 Redis 缓存 key 有效期是多久。如下,图片OK,看到是 590 秒有效期后,我们就大功告成了,希望本文能对大家有所帮助。 当前文章:SpringCache缓存注解这样用,实在是太香了! 网站URL:http://www.csdahua.cn/qtweb/news46/269996.html 网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等 广告 声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网 成都快上网为您推荐相关内容 深入探讨数据库相关的英语术语和概念 (数据库相关英语) Linux配置必备技能(linux需要怎样的配置) html如何阻止表单提交 山东高防云服务器租用多少钱一个月 linux中如何实现查看文件夹大小的方法(linux中如何实现查看文件夹大小的方法有哪些) windows12旗舰版怎么下载?(windows游戏专用系统下载) vps多少钱一台 域名注册需要考虑哪些要素呢? 大学生如何建立网站平台 品牌网站制作知识 云ip地址怎样设置?云服务器添加内网ip 怎么在iis上发布网站?发布站服务器 Redis中输入字符时的实时打印(redis输入字符时打印) chromehosts文件 kafka怎么实现数据一致性 外资企业可以申请ICP吗外资公司申请ICP?外企提供数据服务资质 电脑怎么看内存条 北京云途旅行社官网 java对象序列化的方法有哪些 智能媒体管理帮忙看下这个请求是怎么个错误原因? Oracleto_char函数具有强大功能的体现 Redis循环写入失败尝试解决之路(循环写redis失败) 莫慌!DevOps团队能缓解云迁移问题 独立服务器租用好处有哪些方面 下载更新速度太慢怎么办?(如何更新服务器缓存) 分类信息网 雨棚定制 墙体彩绘 展览展示 纱窗 集装箱 石雕 湿喷机 人造雾 玻璃贴膜 建筑动画 木托盘 岗亭 航空箱 发电机回收 木屋 发电机租赁 娄底尾呼妄服装 贵州义龙电信机房 企业网站建设 眉山托管服务器 联通机柜租用 广安网站建设 蓬溪网站建设 绵阳网站建设公司 手机网站建设公司 成都做网站建设公司 成都光华机房 商标注册 成都app开发 营销型网站建设 品牌设计 成都服务器托管 橡塑保温管 广安搬家公司 成都微商城 成都画册制作
这里面简单对 RedisCacheConfiguration 缓存配置做一下说明:
那么使用如上配置生成的 Redis 缓存 key 名称是什么样得嘞?这里用开源项目 crowd-admin 的 ConfigServiceImpl 类下 getValueByKey(String key) 方法举例,
@Cacheable(value = "configCache", key = "#root.methodName + '_' + #root.args[0]") @Override public String getValueByKey(String key) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("configKey", key); Config config = getOne(wrapper); if (config == null) { return null; } return config.getConfigValue(); }
执行此方法后,Redis 中缓存 key 名称如下,
crowd:configCache:getValueByKey_sys.name
图片
TTL 过期时间是 287,跟我们全局设置的 300 秒基本是一致的。此时假如我们想把 getValueByKey 方法的缓存有效期单独设置为 600 秒,那我们该如何操作嘞?
@Cacheable 注解默认是没有提供有关缓存有效期设置的。想要单独修改 getValueByKey 方法的缓存有效期只能修改全局的缓存有效期。那么有没有别的方法能够为 getValueByKey 方法单独设置缓存有效期嘞?当然是有的,大家请往下看。
其实我们可以通过自定义 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 类逻辑如下,
接着我们修改下 CacheConfig 类的 cacheManager 方法用以使用 MyRedisCacheManager 类。代码如下,
@Bean public 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,单独标识缓存有效期。代码如下,
@Cacheable(value = "configCache#600", key = "#root.methodName + '_' + #root.args[0]") @Override public String getValueByKey(String key) { ... }
看下 getValueByKey 方法生成的 Redis 缓存 key 有效期是多久。如下,
OK,看到是 590 秒有效期后,我们就大功告成了,希望本文能对大家有所帮助。
当前文章:SpringCache缓存注解这样用,实在是太香了! 网站URL:http://www.csdahua.cn/qtweb/news46/269996.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
广告
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网
成都快上网为您推荐相关内容
品牌网站制作知识
分类信息网