SpringCache
简介
springCache并不像正常缓存那样存储数据,而是在我们调用一个缓存方法时,会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该方法时将不再调用该方法,而是直接从缓存中获取结果进行返回,从而实现缓存的效果
@Cacheable注解
该注解用于标记缓存,就是对使用注解的位置进行缓存。该注解可以在方法或者类上进行标记,在类上标记时,该类所有方法都支持缓存
@Cacable使用时通常搭配三个属性使用
value
必须指定,用来指定Cache的名称,就是存储于哪个Cache上。
key
不必须指定,用于指定生成缓存对应的key,如果没有指定,则会为我们默认策略生成key。还可使用EL表达式用对象的属性指定key,如下代码
@Cacheable(value="users", key="#user.id")
public User findUser(User user){
return user;
}
condition
用来指定当前缓存的出发条件,如下面代码,则当user.id为偶数时才会触发缓存
@Cacheable(value="users", key="#user.id",condition="#user.id%2==0")
public User findUser(User user){
return user;
}
@CachePut注解
该注解将标记的方法的返回值放入缓存中,使用方法与@Cacheable一样。
那么,就会有一个问题,@Cacheable与@CachePut到底有什么区别呢?
当缓存中有相同的key的时候,@Cacheable不会存入缓存,而是直接从缓存中返回该key的值,而@CachePut不会管有不有相同的key,而是直接存入缓存。
@CacheEvict注解
该注解用于清除缓存数据,使用在类上时,清除该类所有方法的缓存。@CacheEvict也有@Cacheable三个属性,同时还有一个allEntries属性,该属性默认为false,当为true时,删除该value所有缓存。
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Controler.java
使用jpa操作mysql数据库,博客地址点击此
@RestController
@RequestMapping("test")
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/saveUser")
@CachePut(value = "user", key="#id")
public User saveUser(Long id, String userName, String userPassword){
User user = new User(id, userName, userPassword);
userRepository.save(user);
return user;
}
@GetMapping("/updateUser")
public void updateUser(Long id, String userName, String userPassword){
User user = new User(id, userName, userPassword);
userRepository.save(user);
}
@GetMapping("/deleteUser")
@CacheEvict(value = "user", key = "#id")
public void deleteUser(Long id){
userRepository.deleteById(id);
}
@GetMapping("/getUserById")
@Cacheable(value = "user", key = "#id")
public Optional<User> getUserById(Long id){
return userRepository.findById(id);
}
@CacheEvict(value = "user", allEntries = true)
public void deleteCache(){
}
}
启动
启动前,需要在启动类上加上**@EnableCaching注解**,表明启动缓存,然后启动测试。
总结
对于高并发等情况,缓存的作用母庸质疑,一般来说会将访问量比较大的数据从数据库中查询出来放入缓存中,当下次获取数据的时候,直接从缓存中获取。通常缓存放入内存或硬盘中。