一、概念
缓存是每个系统都应该考虑的功能 用于加速系统的访问和提升系统的性能
例如一个电商网站的商品信息 如果每次都要查询数据库 耗时过大
此时 可以引入一个缓存中间件 将商品数据信息放入缓存中 就不用查询数据库了 直接查询缓存即可
缓存中若有 则直接使用 缓存中若没有 则查询数据库 并将数据信息放入缓存中
因为 应用程序和缓存的交互是非常快的 速度比查询数据库要快的多 尤其是数据库庞大的情况下
或者处理临时数据 比如验证码 三分钟有效 用完即删除
那么这些数据可以放入缓存中 系统从缓存中存取即可 若到时间则从缓存中删除
应用场景非常广泛
1、JSR-107
为了统一缓存的开发规范 并提升系统的扩展性
J2EE发布了JSR-107缓存规范
Java Caching定义了5个核心接口 分别为CachingProvider 和 CacheManager 和 Cache 和 Entry 和 Expiry
其中:
-
CachingProvider(缓存提供者)定义 创建 配置 获取 管理和控制多个CacheManager(缓存管理器)
一个应用可以在运行期访问多个CachingProvider -
CacheManager(缓存管理器)定义 创建 配置 获取 管理和控制多个唯一命名的Cache
这些Cache存在于CacheManager的上下文中
一个CacheManager仅能被一个CachingProvider所拥有 -
Cache(缓存)是一个类似Map的数据结构并临时存储以Key为索引的值
一个Cache仅能被一个CacheManager所拥有 -
Entry是一个存储在Cache中的key-value键值对
-
Expiry是有效期
每一个存储在Cache中的条目有一个定义的有效期 一旦超过这个时间 条目即为过期状态
一旦过期 则条目将不可访问 更新和删除
缓存有效期可通过ExpiryPolicy设置
JSR-107定义的都是一些接口 这样 类似于JDBC 直接面向接口编程
然鹅 但并不是市面上所有的缓存组件都提供了JSR-107的实现
若无类似的实现 则须自己写相应的实现
因此JSR-107的使用并不是很多
2、SpringCache缓存抽象
Spring从3.1之后引入了基于注解的缓存技术 本质并不是一个具体的缓存实现方案 而是一个对缓存使用的抽象
通过在既有代码中添加其定义的注解 即能够达到缓存的效果
定义了org.springframework.cache.Cache
和org.springframework.cache.CacheManager
这两个接口来统一不同的缓存技术
并支持使用JCache(JSR-107)注解来简化开发
①、类
- Cache:缓存接口 用于定义缓存操作
它的实现有RedisCache EhCacheCache ConcurrentMapCache等
Cache接口的实现不同 则使用的缓存技术也不同 - CacheManager:缓存管理器 用于管理各种缓存组件(Cache)
②、注解
@Cacheable
:对方法添加该注解 能够根据方法的请求参数对其结果进行缓存
被该注解标注的结果将被缓存
例:
@Cacheable
public User getUser(Integer id)
@CacheEvict
:清空缓存
例:
@CacheEvict
public void deleteUser(Integer id)
@CachePut
:保证方法被调用 又希望结果被缓存
用于缓存更新
例:
@CachePut
publit User updateUser(User user)
@EnableCaching
:标注在启动类上 开启基于注解的缓存
二、使用
在用向导创建项目的时候要引入Spring Cache模块
或者自己添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
然后 在主程序类上加上@EnableCaching
注解 开启基于注解的缓存:
注:必须开启 否则无法使用缓存
@MapperScan("net.zjitc.springboot.mapper")
@SpringBootApplication
@EnableCaching
public class SpringbootCacheApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootCacheApplication.class, args);
}
}
之后就是在方法上添加相应的缓存注解了:
在案例中 我用的是MyBatis 当然 其它持久层框架也可以
1、@Cacheable
注解:
使用@Cacheable
注解 将方法的运行结果进行缓存
之后再需要获取相同的数据时 直接可从缓存中获取
@Service
public c