整合Spring-cache做缓存
引言:
这个是spring自带的cache,底层是用map实现的。缓存数据量不是很大推荐使用,不然还是要用第三方的缓存redis、echcache等。
1、maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2、新建user实体类(常规操作)。我这里用了lombok,上面依赖没有贴这不是主要的
@Data
public class User {
private String name;
private Integer age;
}
3、启动类上加上@EnableCaching,开始缓存
@EnableCaching
@SpringBootApplication
public class CsdnDemoApplication {
public static void main(String[] args) {
SpringApplication.run(CsdnDemoApplication.class, args);
}
}
4、service层。(写的很简单,没有写实现层)
在需要缓存数据的方法上加上@Cacheable注解,cacheNames+key成为该缓存值的key,通过#获取方法上的参数。方法的返回值成为缓存的value。
加上这个注解过后他首先会去查询缓存中是否存在,命中就直接返回;没有命中查询数据库返回并缓存到cache中。
#参数名可以从方法参数中取值;也可以#p0、#p1取出第几个参数(下标从0开始);参数如果是一个对象可以#object.属性名(SpEL表达式)取值。
注:cacheNames是spring4.2版本新加的,以前版本用value
@Service
public class UserService {
@Cacheable(cacheNames = "user", key = "#name")
public User getUser(String name) {
return selectByName(name);
}
/**
* 模拟查询数据库
* @param name
* @return
* User
*/
private User selectByName(String name) {
User user = new User();
user.setName(name);
user.setAge(22);
System.out.println("查询数据库:" + name);
return user;
}
}
5、controller简单写个方法测试
@RestController
public class TestController {
@Autowired
private UserService userService;
@GetMapping("/get")
public User getUser(String name) {
return userService.getUser(name);
}
}
6、调用验证结果
刷新在调用一次,控制台没有打印新的日志,说明查询的缓存
7、移除缓存
方法上加上@CacheEvict注解,方法执行完成后会用cacheNames+key去缓存中匹配然后移除缓存
@CacheEvict(cacheNames = "user", key = "#name")
public boolean delUser(String name) {
//TODO:数据库删除操作
System.out.println("移除user:" + name);
return true;
}
@GetMapping("/del")
public Boolean delUser(String name) {
return userService.delUser(name);
}
再次调用查询接口,因为已经移除了缓存的原因,又会去查询数据库。
8、更新缓存
方法上@CachePut注解,会把返回值写入到缓存中去。与@Cacheable的区别:cacheable会在执行方法前检查cache是否存在,存在就直接返回cache中的值,否则执行方法并把返回值写入cache;而cachePut不会去检查,每次都会执行方法并把返回值写入cache.
@CachePut(cacheNames = "user", key = "#name")
public User updateUser(String name) {
User user = new User();
user.setName(name);
user.setAge(30);
//TODO:数据库修改
System.out.println("修改user:" + name);
return user;
}
@GetMapping("/update")
public User updateUser(String name) {
return userService.updateUser(name);
}
再次调用查询接口:缓存中已是修改后的值
springboot整合springcache简单的操作就这样完成了。
希望对您有所微薄的帮助!
向上的路并不拥挤,而大多数人选择了安逸。--it疯子也