当前位置: 首页 > news >正文

Spring 缓存注解

Spring Cache 框架给我们提供了 @Cacheable 注解用于缓存方法返回内容。但是 @Cacheable 注解不能定义缓存有效期。这样的话在一些需要自定义缓存有效期的场景就不太实用。

按照 Spring Cache 框架给我们提供的 RedisCacheManager 实现,只能在全局设置缓存有效期。这里给大家看一个常规的 CacheConfig 缓存配置类,代码如下,

@EnableCaching
@Configuration
public 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:";@Beanpublic 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);}
}

自定义 MyRedisCacheManager 缓存

其实我们可以通过自定义 MyRedisCacheManager 类继承 Spring Cache 提供的 RedisCacheManager 类后,重写 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法来完成自定义缓存有效期的功能,代码如下

public class MyRedisCacheManager extends RedisCacheManager {public MyRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {super(cacheWriter, defaultCacheConfiguration);}@Overrideprotected 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);}
}

相关文章:

  • 2023-11-10 数据库-Presto-记录
  • Css问题:推荐几个超好看渐变色!项目中可用
  • 软件版本控制系统VCS工具——cvs vss svn git
  • 思科C9300交换机堆叠
  • matplotlib从起点出发(11)_Tutorial_11_TightLayout
  • 利用Caddy实现http反向代理
  • 网络安全深入学习第八课——代理与端口转发
  • 【FastCAE源码阅读7】视图方向切换按钮实现原理
  • 【论文阅读】多模态NeRF:Cross-Spectral Neural Radiance Fields
  • LeetCode(1)合并两个有序数组【数组/字符串】【简单】
  • k8s持久化存储PV、PVC
  • 【Ruoyi管理后台】用户登录强制修改密码
  • Linux awk命令
  • 百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧
  • docker下的nginx代理转发到tomcat
  • 【Leetcode】101. 对称二叉树
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • FastReport在线报表设计器工作原理
  • Lsb图片隐写
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • vue自定义指令实现v-tap插件
  • 测试如何在敏捷团队中工作?
  • 搭建gitbook 和 访问权限认证
  • 观察者模式实现非直接耦合
  • 那些被忽略的 JavaScript 数组方法细节
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 云大使推广中的常见热门问题
  • AI算硅基生命吗,为什么?
  • # Panda3d 碰撞检测系统介绍
  • #微信小程序:微信小程序常见的配置传旨
  • (04)odoo视图操作
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (AngularJS)Angular 控制器之间通信初探
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (十一)c52学习之旅-动态数码管
  • (转载)Google Chrome调试JS
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ./configure,make,make install的作用
  • .apk 成为历史!
  • .net core webapi 大文件上传到wwwroot文件夹
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Reactor简单使用教程
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .project文件
  • .sdf和.msp文件读取