SpringCache简单梳理
Posted wqq-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCache简单梳理相关的知识,希望对你有一定的参考价值。
参考博客:https://blog.csdn.net/weixin_36279318/article/details/82820880
https://www.cnblogs.com/imyijie/p/6518547.html
https://www.cnblogs.com/zsychanpin/p/7191021.html
https://blog.csdn.net/s297485987/article/details/80781380
https://www.cnblogs.com/kingsonfu/p/10409596.html
一.Cache是什么,为什么要用缓存
一个项目随着时间的积累, 数据规模会越来越大, 对数据的访问需求也越来越高, 数据库的查询等操作的使用量也会越来越大.但是数据库的性能是有上限的.因此如何提高数据查询的性能, 分担数据库的访问压力也成为了一个重要的功能.
而缓存就是实际工作中经常会被使用的一种分担数据库访问压力,提高数据查询性能的方法.
从3.1开始Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的,其核心思想是:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值存放在缓存中,等到下次利用同样的参数调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回。
Spring Cache, 本质上不是一个具体的缓存实现方案, 而是一个对缓存使用的抽象, 只要通过一定的配置和既有的代码,注解,就可以利用各种缓存方案 如EHCache,Redis等, 来暂时存储数据.
二.怎么使用Cache
使用Spring Cache只需要我们做两件事
(1)声明某些方法使用缓存
(2)配置Spring对Cache的支持
Spring为我们提供了几种注解来支持SpringCache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。
三.理解Cache缓存的内容和思路
Java Caching的五个核心接口:
- CachingProvider 定义了创建,配置,获取,管理和控制多个CacheManager. 一个应用可以在运行时访问多个CachingProvider
- CacheManager 定义了创建,配置,获取,管理和控制多个唯一命名的Cache, 这些Cache存在于CacheManager的上下文中. 一个CacheManager只能被一个CachingProvider所拥有.
- Cache 是一个类似Map的数据结构并临时存储以key为索引的值. 一个Cache仅被一个CacheManager所拥有.
- Entry 是一个存储在Cache中的key-value对
- Expiry 每一个存储在Cache中的条目有一个定义的有效期.一旦超过这个有效期,条目为过期的状态,条目将不可访问 ,更新和删除. 缓存有效期可以通过ExpiryPolicy设置.
以下来自:https://blog.csdn.net/weixin_36279318/article/details/82820880
Spring中定义了org.springframework.cache.Cache接口和org.springframework.cache.CacheManager接口来统一不同的缓存技术, 并支持JCache(JSR-107)注解简化我们开发.
- Cache接口为缓存的组件规范定义, 包含缓存的各种操作集合
- Cache接口下Spring提供了各种xxxCache的实现,如RedisCache,EhCacheCache等.
- 每次调用需要缓存功能的方法时,Spring会检查指定参数的指定目标方法是否已经被调用过,如果有被调用, 则从缓存中获取方法调用后的结果, 如果没有就调用方法, 并把结果缓存后返回给用户. 下次调用时直接从缓冲中获取结果(如果未过期的话)
- 使用Spring缓存抽象时要关注的两点:
1.确定方法需要被缓存以及他们的缓存策略
2.从缓存中读取之前缓存存储的数据
下面是重要的概念和缓存注解
Cache | 缓存接口, 定义缓存操作. 具体实现:RedisCache,EhCacheCache, ConcurentMapCache等 |
CacheManager | 缓存管理器,管理各种缓存组件 |
@Cacheable | 主要针对方法配置, 能够根据方法的请求参数对结果进行缓存 |
@CacheEvict | 清空缓存 |
@CachePut | 保证方法被调用,又希望结果被缓存 |
@EnableCaching | 开启基于注解的缓存 |
keyGenerator | 缓存数据时key生成策略 |
serializer | 缓存数据时,key和value的序列化策略 |
@Cacheable, @CacheEvict 和 @CachePut的主要参数
value | 缓存的名称,在 spring 配置文件中定义,必须指定 至少一个 | 例如: @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”} |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达 式编写,如果不指定,则缺省按照方法的所有参数 进行组合 | 例如: @Cacheable(value=”testcache”,key=”#userName” |
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存/清除缓存,在 调用方法之前之后都能判断 | 例如: @Cacheable(value=”testcache”,condition=”#userNam e.length()>2”) |
allEntries(@CacheEvict) | 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 | 例如:@CachEvict(value=”testcache”,allEntries=true) |
beforeInvocation(@CacheEvict) | 是否在方法执行前就清空,缺省为 false,如果指定 为 true,则在方法还没有执行的时候就清空缓存, 缺省情况下,如果方法执行抛出异常,则不会清空 缓存 | 例如:@CachEvict(value=”testcache”, beforeInvocation=true) |
unless(@CachePut)(@Cacheable) | 用于否决缓存的,不像condition,该表达式只在方 法执行之后判断,此时可以拿到返回值result进行判 断。条件为true不会缓存,fasle才缓存 | 例如:@Cacheable(value=”testcache”,unless=”#result == null”) |
Cache SpEL available metadata
名字 | 位置 | 描述 | 实例 |
methodName | root object | 当前被调用的方法名 | #root.methodName |
method | root object | 当前被调用的方法 | #root.method.name |
target | root object | 当前被调用的目标对象 | #root.target |
targetClass | root object | 当前被调用的目标对象的类 | #root.targetClass |
args | root object | 当前被调用的方法的参数列表 | #root.args[0] |
caches | root object | 当前方法调用使用的缓存列表 | #root.caches[0].name |
argumentname | evaluation context | 方法参数的名字. 0代表参数的索引。 | #a0、#p0 |
result | evaluation context | 方法执行后的返回值 | #result |
以上是关于SpringCache简单梳理的主要内容,如果未能解决你的问题,请参考以下文章