网站建设公司基本流程,ciid中国室内设计官网,外包加工原因,wordpress 网站变慢一、介绍
Spring Cache是一个框架#xff0c;实现了基于注解的缓存功能#xff0c;只需要简单地加一个注解#xff0c;就能实现缓存功能#xff0c;大大简化我们在业务中操作缓存的代码。
Spring Cache只是提供了一层抽象#xff0c;底层可以切换不同的cache实现。具体就…一、介绍
Spring Cache是一个框架实现了基于注解的缓存功能只需要简单地加一个注解就能实现缓存功能大大简化我们在业务中操作缓存的代码。
Spring Cache只是提供了一层抽象底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。
针对不同的缓存技术需要实现不同的CacheManager
CacheManager描述EhCacheCacheManager使用EhCache作为缓存技术GuavaCacheManager使用Google的GuavaCache作为缓存技术RedisCacheManager使用Redis作为缓存技术 二、注解
在SpringCache中提供了很多缓存操作的注解常见的是以下的几个
注解说明EnableCaching开启缓存注解功能Cacheable在方法执行前spring先查看缓存中是否有数据如果有数据则直接返回缓存数据若没有数据调用方法并将方法返回值放到缓存中CachePut将方法的返回值放到缓存中CacheEvict将一条或多条数据从缓存中删除
在spring boot项目中使用缓存技术只需在项目中导入相关缓存技术的依赖包并在启动类上使用EnableCaching开启缓存支持即可。
例如使用Redis作为缓存技术只需要导入Spring data Redis的maven坐标即可。 三、使用方式
3.1、EnableCaching注解
在引导类上加该注解就代表当前项目开启缓存注解功能。 3.2、CachePut注解
CachePut 说明
作用: 将方法返回值放入缓存
value: 缓存的名称, 每个缓存名称下面可以有很多key
key: 缓存的key ---------- 支持Spring的表达式语言SPEL语法
案例演示 在save方法上加注解CachePut 当前UserController的save方法是用来保存用户信息的我们希望在该用户信息保存到数据库的同时也往缓存中缓存一份数据我们可以在save方法上加上注解 CachePut用法如下 /**
* CachePut将方法返回值放入缓存
* value缓存的名称每个缓存名称下面可以有多个key
* key缓存的key
*/
CachePut(value userCache, key #user.id)
PostMapping
public User save(User user){userService.save(user);return user;
} key的写法如下 #user.id : #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ; #user.name: #user指的是方法形参的名称, name指的是user的name属性 ,也就是使用user的name属性作为key ; #result.id : #result代表方法返回值该表达式代表以返回对象的id属性作为key #result.name : #result代表方法返回值该表达式 代表以返回对象的name属性作为key 3.3、CacheEvict注解
CacheEvict 说明
作用: 清理指定缓存
value: 缓存的名称每个缓存名称下面可以有多个key
key: 缓存的key ---------- 支持Spring的表达式语言SPEL语法
案例演示 在 delete 方法上加注解CacheEvict 当我们在删除数据库user表的数据的时候,我们需要删除缓存中对应的数据,此时就可以使用CacheEvict注解, 具体的使用方式如下: /**
* CacheEvict清理指定缓存
* value缓存的名称每个缓存名称下面可以有多个key
* key缓存的key
*/
CacheEvict(value userCache,key #p0) //#p0 代表第一个参数
//CacheEvict(value userCache,key #root.args[0]) //#root.args[0] 代表第一个参数
//CacheEvict(value userCache,key #id) //#id 代表变量名为id的参数
DeleteMapping(/{id})
public void delete(PathVariable Long id){userService.removeById(id);
} 在 update 方法上加注解CacheEvict 在更新数据之后数据库的数据已经发生了变更我们需要将缓存中对应的数据删除掉避免出现数据库数据与缓存数据不一致的情况。 //CacheEvict(value userCache,key #p0.id) //第一个参数的id属性
//CacheEvict(value userCache,key #user.id) //参数名为user参数的id属性
//CacheEvict(value userCache,key #root.args[0].id) //第一个参数的id属性
CacheEvict(value userCache,key #result.id) //返回值的id属性
PutMapping
public User update(User user){userService.updateById(user);return user;
} 3.4、Cacheable注解
Cacheable 说明:
作用: 在方法执行前spring先查看缓存中是否有数据如果有数据则直接返回缓存数据若没有数据调用方法并将方法返回值放到缓存中
value: 缓存的名称每个缓存名称下面可以有多个key
key: 缓存的key ---------- 支持Spring的表达式语言SPEL语法
案例演示 在getById上加注解Cacheable /**
* Cacheable在方法执行前spring先查看缓存中是否有数据如果有数据则直接返回缓存数据若没有数据调用方法并将方法返回值放到缓存中
* value缓存的名称每个缓存名称下面可以有多个key
* key缓存的key
*/
Cacheable(value userCache,key #id)
GetMapping(/{id})
public User getById(PathVariable Long id){User user userService.getById(id);return user;
} 缓存非null值 在Cacheable注解中提供了两个属性分别为 condition unless 。 condition : 表示满足什么条件, 再进行缓存 ;unless : 表示满足条件则不缓存 ; 与上述的condition是反向的 ; 具体实现方式如下: /*** Cacheable在方法执行前spring先查看缓存中是否有数据如果有数据则直接返回缓存数据若没有数据调用方法并将方法返回值放到缓存中* value缓存的名称每个缓存名称下面可以有多个key* key缓存的key* condition条件满足条件时才缓存数据* unless满足条件则不缓存*/
Cacheable(value userCache,key #id, unless #result null)
GetMapping(/{id})
public User getById(PathVariable Long id){User user userService.getById(id);return user;
} 注意 此处我们使用的时候只能够使用 unless 因为在condition中我们是无法获取到结果 #result的 在list方法上加注解Cacheable 在list方法中进行查询时有两个查询条件如果传递了id根据id查询 如果传递了name 根据name查询那么我们缓存的key在设计的时候就需要既包含id又包含name。 具体的代码实现如下 Cacheable(value userCache,key #user.id _ #user.name)
GetMapping(/list)
public ListUser list(User user){LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper();queryWrapper.eq(user.getId() ! null,User::getId,user.getId());queryWrapper.eq(user.getName() ! null,User::getName,user.getName());ListUser list userService.list(queryWrapper);return list;
} 四、集成Redis
在使用上述默认的ConcurrentHashMap做缓存时服务重启之后之前缓存的数据就全部丢失了操作起来并不友好。在项目中使用我们会选择使用redis来做缓存主要需要操作以下几步 pom.xml dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-cache/artifactId
/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
/dependency application.yml spring:redis:host: localhostport: 6379password: root123456database: 0cache:redis:time-to-live: 1800000 #设置缓存过期时间可选