Cache概念
不同层级对应的缓存技术选型
系统层级 | 缓存层级 | 使用技术 |
Web | 浏览器缓存、代理服务器缓存、网关缓存 | HTTP头信息控制、代理服务器或CDN、反向代理或间接代理 |
应用层 | 单机缓存、分布式缓存 | JVM或者服务器内存、Ehcache、Redis |
数据层 | ORM缓存 | Hibernate、JPA的一级、二级缓存 |
缓存命中率:
- 命中率=从缓存中读取数据的次数与总的读取数据的次数的比值
- 过期策略
FIFO、LRU(最久未使用)、LFU(最近最少使用)、TTL(存活期)、TTI(空闲期)
使用Spring Cache的优点:
- 支持开箱即用(Out-Of-The-Box)并提供基本的Cache,方便切换各种底层缓存抽象
- 类似于Spring提供的数据库事物管理,通过Cache注解即可实现缓存逻辑透明化,让开发者关注业务逻辑
- 事务回滚时,缓存也会回滚
- 支持比较复杂的缓存逻辑
- 提供缓存编程的一致性抽象,方便代码维护
注意:Spring Cache不针对多线程的应用环境进行专门处理,在分布式或者集群环境下需要针对具体的缓存进行相应的配置。
Spring Cache
- Java 的缓存和序列化是息息相关的,需要缓存的实体一般需要实现Serializable接口,对EhCache、Redis等套件来说能缓存的实体应该可序列化
- 缓存定义:确定需要缓存的方法和缓存策略
- 缓存配置:配置缓存
缓存注解
- @Cacheable:
(1)指定被注解的方法返回值是可被缓存的
(2)工作原理:Spring先在缓存中查找数据,如果没有则执行方法。缓存名时必须提供的,可以用列表提供多个cache各个名字之间用“,”隔开,用花括号括起来。
例如:@Cacheable(value={“cache1”.”cache2”,”cache3”}) - 本质:键值对的集合
-
参数 说明 示例 value/cacheNames 缓存的名字,在Spring配置文件定义,必须至少有一个 @Cacheable(cacheNames=”cache1”) key 缓存的key。可以为空,如果指定,必须按spEl表达式编写,不指定则按照方法的所以参数进行组合 @Cacheable(key=”#userName”,value=”cache1”) condition 缓存的条件,可以为空,使用spEl表达式返回true 或false 只有返回true才缓存,unless与condition相反 @Cacheable(cacheNames={“cache1”,”cache2”},condition=”userName.length()>2”) - @CachePut
使用该注解来更新缓存 - @CacheEvict
从给定的缓存中移除一个值
(1)allEbtries属性:是否移除所以缓存 @CacheEvict(value=”cache1”,allEntries=true/false)
(2)beforeInvocation属性:默认清除缓存方法是在方法执行后触发,默认为false 设置为true则在方法执行前触发 - @Caching:
类级别的缓存