SpringCache缓存介绍

📅 2026/7/1 2:31:52
SpringCache缓存介绍
SpringCache注解在SpringCache中提供了很多缓存操作的注解常见的是以下的几个注解 说明EnableCaching 开启缓存注解功能Cacheable 在方法执行前spring先查看缓存中是否有数据如果有数据则直接返回缓存数据若没有数据调用方法并将方法返回值放到缓存中CachePut 将方法的返回值放到缓存中CacheEvict 将一条或多条数据从缓存中删除2.1 CachePut注解CachePut 说明​ 作用: 将方法返回值放入缓存​ value: 缓存的名称, 每个缓存名称下面可以有很多key​ key: 缓存的key ---------- 支持Spring的表达式语言SPEL语法使用示例在save方法上加注解CachePut。当前UserController的save方法是用来保存用户信息的我们希望在该用户信息保存到数据库的同时也往缓存中缓存一份数据我们可以在save方法上加上注解 CachePut用法如下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 2.2 CacheEvict注解CacheEvict 说明​ 作用: 清理指定缓存​ value: 缓存的名称每个缓存名称下面可以有多个key​ key: 缓存的key ---------- 支持Spring的表达式语言SPEL语法使用示例 在 delete 方法上加注解CacheEvict。当我们在删除数据库user表的数据的时候我们需要删除缓存中对应的数据此时就可以使用CacheEvict注解, 具体的使用方式如下:CacheEvict(value userCache,key #p0) //#p0 代表第一个参数 //CacheEvict(value userCache,key #id) //#id 代表变量名为id的参数 DeleteMapping(/{id}) public void delete(PathVariable Long id){ userService.removeById(id); }2.3 Cacheable注解Cacheable 说明:​ 作用: 在方法执行前spring先查看缓存中是否有数据如果有数据则直接返回缓存数据若没有数据调用方法并将方法返回值放到缓存中​ value: 缓存的名称每个缓存名称下面可以有多个key​ key: 缓存的key ---------- 支持Spring的表达式语言SPEL语法使用情况1在getById上加注解CacheableCacheable(value userCache,key #id) GetMapping(/{id}) public User getById(PathVariable Long id){ User user userService.getById(id); return user; }当我们在测试时查询一个数据库不存在的id值第一次查询缓存中没有也会查询数据库。而第二次再查询时会发现不再查询数据库了而是直接返回那也就是说如果根据ID没有查询到数据,那么会自动缓存一个null值。我们能不能做到当查询到的值不为null时再进行缓存如果为null则不缓存呢? 答案是可以的。使用情况2 缓存非null值。在Cacheable注解中提供了两个属性分别为 condition unless 。condition : 表示满足条件时才缓存数据;unless : 表示满足条件则不缓存 ; 与上述的condition是反向的 ;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的。