Spring Cache
1.Spring Cache 介绍
说明:Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单的加一个注解就能实现缓存功能.Spring Cache提供了一层抽象,底层可以切换不同的cache实现,具体就是通过CacheManager接口来统一不同的缓存技术.
CacheManager是Spring提供的各种缓存技术的抽象接口
2、Spring Cache 常用注解
1.1SpringCache_使用方式——CachePut注解
创建一个简单的Spring boot的项目,在UsrController层中自动装配一个CacheManager
注:CacheManager其实是一个接口,具体的缓存管理器有这么几种,这里使用框架给我们提供的,默认的ConcurrentMapCacheManager
说明:这个CachePut注解一般都是写在Controller的一个方法上,前面的这个value = “usrCache”–>其实就是缓存的名称,每个缓存名称下面可以有多个key,在save方法上,我们想要key来动态的获取 #result(这个就表示返回值,usr),#usr.id就可以动态的获取到id.–>选用id是因为 id 一般就是唯一标识
这里用加断点的方式来在usr.Service.save(usr)上加一个断点:
在postman中发送两个post请求,两个表单数据,name 和 age我们可以看到,发送过来的请求,其实是将这个数据放入ConcurrentMapCheManager类管理的 一个 ConcurrentHashMap 这个对象里面.
提示:这个map其实是基于内存的,当服务停止,再重启服务,这个缓存的数据就没有了.
解决方法:后期使用 redis这种缓存方式
2.1SpringCache_使用方式_CacheEvict注解1
@CacheEvict注解可以用来清理缓存的数据
value来指定是哪个缓存(就是缓存名称),下面的哪一个key。
在这里我们通常想要获取参数的值,由他的说明注解来看:我们有这么几种方式
例如我们可以写 #p0—>代表的就是第一个参数
也可以写 #root.args[0] -->代表还是第一个参数
最简单的还是写 # id (参数名)
这三种方法其实都是为了获取参数.
2.2 SpringCache_使用方式_CacheEvict注解2
同样的,我们在更新数据时也需要先将缓存的数据先删除,否则在进行相关业务处理的时候会出现,数据库中的数据更改(操作mysql数据库),但是页面上的数据未做更改(使用redis缓存了数据,但是没有删除).
在postMan测试,更改一条数据的时候,会根据id先将这条缓存数据删除.然后在经过usrService.updateById去更改数据库中的数据
3.1 SpringCache_使用方式_Cacheable注解
@Cacheable:在方法执行前spring会先查看缓存中是否有数据,如果有数据,则直接返回缓存数据,若没有数据,调用方法返回值放到缓存中去
postman进行测试
说明:1.在UserService.getById(id)处下一个断点,当第一次去查询一个id的时候,会执行到该断点,当重复postman去发一个请求时,则不会到该断点,而是直接返回数据.
2.在发送一个数据库中没有的id时,同样会将这个没有的id进行缓存,例如:想要查找id =123,但是数据库中并没有对应的id,则会缓存 value = "usrCache"这个缓存名称 , 123 --> null这么一个数据
解决方法:其实在Cacheable这个注解下,有这么两个属性
1.condition 即 条件,当满足某条件时,才去缓存数据
String condition() default “”
2.unless 即满足什么条件的时候,不缓存数据
String unless() default “”
故改造一下:
这里设置了 condition = “#result != null”
当返回的结果不为null时,才去缓存数据
SpringCache_使用方式_Cacheable注解2
说明:这里的key 使用 id 和 usr_name来一同动态的获取key .
注:现在的缓存,底层是基于map来实现的,缺点明显,当服务重启后,缓存的数据就不见了 。
----->改善 : 使用 redis
3.在SpringBoot项目中使用Spring Cache的操作步骤(使用redis缓存技术)
1.导入maven坐标
在导入这个maven坐标后,
可以看到CacheManager这个接口的实现类,变多,但是并没有redis的cachemanager,还需要导入另一个maven坐标
在导入redis的这个maven坐标后
可以看到CacheManager这个接口的实现类中出现了一个叫RedisCacheManager的类
2.配置apilication.yml
在配置文件中的spring下配置:
注意这里time-to-live代表的是缓存的时间,单位是毫秒
3.使用注解使用缓存功能
注:使用redis缓存技术时,condition这里不能再使用#result了,可以comand + b 进入 @Cacheable注解中去查看,所以 这里改用 unless -->注意条件