
时间:2026-10-15 编辑:
2 SpringBoot——缓存
缓存是指可以进⾏⾼速数据交换的存储器,使⽤它可以更快速的操作和访问数据。
应用程序未加入缓存时,用户访问数据时会直接访问数据库:

当加入缓存后,可以有效缓解数据库的压力:

缓存的优点:
使⽤缓存可以避免访问数据库,节省数据库服务器的资源;
性能更快,缓存属于内存级的服务器,⽽ DB 牵扯到更多的业务逻辑判断和磁盘操作,因此缓存的性能更⾼。
1)开启缓存
主启动器类上配置@EnableCaching
@SpringBootApplication
@EnableCaching // 开启缓存
public class MyfirstApplication {
public static void main(String[] args) {
SpringApplication.run(MyfirstApplication.class, args);
}
}2) 缓存的操作方法:添加、修改、删除
@Cacheable:查询
cacheNames/value:指定缓存组件的名字;
key:缓存数据使用的key,可以指定。默认即使用方法参数的值
condition:指定符合条件的情况下才缓存;如condition="#id>0"
@CachePut:更新
修改了数据库的某个数据,同时更新缓存
value:缓存名
key:确保更新的key和#id一致即可做到同时更新数据库数据和缓存中的数据
@CacheEvict:删除
key:指定要清除的数据(对应上key可实现同时删除数据库和缓存中的数据)

在 Service 层增加三个缓存操作的⽅法:添加缓存、修改缓存、删除缓存,
编写User类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
public String name;
public int age;
public int id;
}编写service:
@Service
public class UserService {
//使用缓存查询用户
@Cacheable(cacheNames = "getuser",key="#id")
public User getUserById(int id){
System.out.println("开始根据id查询用户了");
User user = new User();
user.setId(id);
user.setAge(18);
user.setName("张飞");
return user;
}
//修改缓存中的内容
@CachePut(cacheNames = "getuser",key="#id")
public User updateUser(int id,String name){
User user = new User();
user.setId(id);
user.setAge(18);
user.setName(name);
return user;
}
//删除缓存
@CacheEvict(cacheNames = "getuser",key="#id")
public boolean delUser(int id){
return true;
}
}编写controller层:
@RestController //返回响应为json格式
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getUser")
public User getUserById(int id){
return userService.getUserById(id);
}
@RequestMapping("/update")
public User updateUser(int id,String name){
return userService.updateUser(id,name);
}
@RequestMapping("/del")
public boolean delUser(int id){
return userService.delUser(id);
}
}调用postman访问http://localhost:8080/getUser?id=1:发现只有第一次调用时后台才打印
开始根据id查询用户了1.
后面不管查询几次其实都是访问的缓存了。
当访问http://localhost:8080/update?id=1&name=刘备后,相当于对缓存中的内容进行了修改,当再访问http://localhost:8080/getUser?id=1时获得的就是修改(数据库中的数据也一同修改)后的数据了。当访问http://localhost:8080/del?id=1后就将缓存删除(数据库中的数据也一同删除)。
Cache 本质上是⽤ ConCurrentMap 的数据结构来实现。
Java Caching定义了5个核心接口
CachingProvider
CacheManager
Cache
Entry
Expiry
1) CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
2) CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
3) Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。
4) Entry是一个存储在Cache中的key-value对.
5) Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。