【Spring】Spring @Cacheable 官方学习及demo

25 篇文章 0 订阅

前言

Spring 有很多声明式的编程风格,@Transactional 是,@Cacheable 也是。说起 @Transactional,复杂的事务情况下,这个注解也有局限,需要用到编程式的事务完成需求。同样地,@Cacheable 也是适合简单的缓存场景

@Cacheable 的来源

在这里插入图片描述

  • 来自 Spring Framwork - Integration。

    在 Integration 项目中,查了下资料,是受 《Enterprise Integration Patterns 》的启发,内容待研究,本文不提。

  • 沿袭官方的称呼,后文把这个包都称为 Cache Abstraction
    • 相关的注解还有

      • @Cacheable: Triggers cache population. 笔记:方法返回值写入缓存
      • @CacheEvict: Triggers cache eviction. 笔记:清除缓存
      • @CachePut: Updates the cache without interfering with the method execution. 笔记:更新缓存,强调不干扰方法执行
      • @Caching: Regroups multiple cache operations to be applied on a method. 笔记:v支持缓存组合操作
      • @CacheConfig: Shares some common cache-related settings at class-level. 笔记:作用其实跟@RequestMapping差不多
    • 缓存的增删改查的修饰,比如缓存名、缓存的key、缓存的value,都声明为注解参数或者方法返回值

      • cacheNames 笔记:缓存名
      • key 笔记:对应缓存名的key
      • keyGenerator 笔记:更详细的key处理方式
      • cacheManager 笔记:非必填,需要了解这个参数的时候再填
      • cacheResolver 笔记:非必填,需要了解这个参数的时候再填

      摘一个原文,提醒互斥的参数不要同时存在在注解上。
      Similarly to key and keyGenerator, the cacheManager and cacheResolver parameters are mutually exclusive, and an operation specifying both results in an exception, as a custom CacheManager is ignored by the CacheResolver implementation. This is probably not what you expect.

应用场景

类比 @Transactional,无论应用集成的是MySQL、Oracle、PostgreSQL,用该注解都能获得事务支持。
同样的,@Cacheable 等注解,背后可以是简单的 ConcurrentHashMap ,也可以是 Redis.

集成Redis的思路

本质上跟 @Transactional 集成 MySQL 没什么太大区别。注意Spring Boot 项目可以很方便的引入 spring-data-redis

  • spring-data-redis 里面有 cacheManager 的实现类注入到容器中,侧面应证了这个项目支持 Cache Abstraction
  • spring-data-redis 官方文档说明,可选两种驱动实现,这里选Jedis
  • spring-data-redis 官方文档说明,注入符合需求的 bean,这里 JedisConnectionFactory
  • 按照 Cache Abstraction 的规范,注入符合需求的 bean,这里注入 RedisCacheManager
  • @EnableCaching 在启动类启用 Cache Abstraction 支持

代码及验证

github
允许单元测试,注意可以断点的方式确认缓存写入、缓存生效(不调用方法内的逻辑)
在这里插入图片描述

后记

Cache Abstraction 缓存的增删改查,跟着官网,实现起来都很简单。针对只读的数据,提升响应速度,用这个注解可以让代码更清爽。更高级的用法,比如设置TTL,官网也有例子。在使用redis集群的时候,配合 spring-data-redis,限制就稍微多点,目前觉得这个场景下用这个抽象没有安全感。另外,Spring Boot 或是 Spring 的集成还是很有自己的风格的,看看文档,决定配置,把配置bean注入,集成就完成拉。后续从架构的角度学学 《Enterprise Integration Patterns》,窥探一下 Spring Framwork - Integration 背后参考的架构设计。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值