当前位置: 首页 > 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);}
}

http://www.lryc.cn/news/225544.html

相关文章:

  • 微信小程序前端开发
  • C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割
  • 无需开发,精臣云可轻松连接用户运营、广告推广等行业应用
  • 第三阶段第一章——PySpark实战
  • Python数据容器(字符串)
  • Python---练习:把8名讲师随机分配到3个教室
  • python+requests接口自动化测试
  • 【T3】畅捷通T3采购管理模块反结账,提示:本年数据已经结转,不能取消结账。
  • 线性代数(五) | 矩阵对角化 特征值 特征向量
  • 读书笔记:彼得·德鲁克《认识管理》第12章 服务机构的绩效管理
  • 基于FPGA的模板匹配红外目标跟踪算法设计
  • ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR
  • 用于强化学习的置换不变神经网络
  • 【华为OD题库-008】座位调整-Java
  • 4 Paimon数据湖之Hive Catalog的使用
  • Verilog刷题[hdlbits] :Bcdadd100
  • Flink—— Data Source 介绍
  • 树之二叉排序树(二叉搜索树)
  • 管易云与电商平台的无代码集成:实现API连接与用户运营
  • ElementUI的el-upload上传组件与表单一起提交遇到的各种问题以及解决办法(超详细,每个步骤都有详细解读)
  • python flask_restful “message“: “Failed to decode JSON object: None“
  • Linux内核有什么之内存管理子系统有什么第六回 —— 小内存分配(4)
  • 【OpenHarmony内核】Harmony内核之线程操作函数(二)
  • 二十五、W5100S/W5500+RP2040树莓派Pico<Modebus TCP Server示例>
  • Android画个圆点状态灯
  • 高性能网络编程 - 解读3种线程模型
  • MATLAB中deconvwnr函数用法
  • 赛宁网安入选国家工业信息安全漏洞库(CICSVD)2023年度技术组成员单
  • Git系列之Git集成开发工具及git扩展使用
  • selenium headless 无头模式慢