/**
* 查询所有菜单。
* 请思考,菜单数据会经常变化吗,假如每次访问菜单数据都查数据库
* 是否会对数据库带来一定的访问压力。即便是没有压力,那访问数据库
* 的性能相对于直接访问内存,是不是会低一些?我们能否将查询到的
* 数据在缓存放一份,下一次再取时,从数据库取。
* @return
*/
第一步 在启动类上添加注解
@EnableCaching
其目的 启动spring boot 工程中的内置缓存 提高查询性能
package com.cy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@EnableCaching
@SpringBootApplication
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
}
第二步 在业务层上添加注解
@Cacheable("sysMenu") //缓存应用的切入点方法(底层AOP)
@Override
public List<SysMenu> findMenus() {
//从缓存取,缓存有则直接返回
//假如缓存没有,则去查数据库,然后将查询到结果存储到缓存
return sysMenuDao.selectMenus();
}
测试: 使用Controller 中设定的url 进行查询 服务器端没有 日志的产生,原因是查询到的参数存入到了缓存中,缓存中有直接去缓存中去取,如果缓存中没有则进行访问,和maven 的下载机制类似。
第三步 数据不一致解决
描述: 使用先使用get 的url获取数据 获取成功后在进行update 进行修改,修改完成后在使用get的 url请求数据,发现两者的信息不匹配。
解决方案 在业务层添加注解
在执行 update 修改时,对缓存进行清理,解决
/**
* @CacheEvict注解描述方法时,表示方法是一个清缓存的切入点方法
* 这里的value属性值表示要清除的缓存,allEntries=true表示要清除当前value
* 属性指向的cache中所有数据
*
*
*/
@CacheEvict(value="sysMenu",allEntries = true,beforeInvocation = false)
@Override
public int updateMenu(SysMenu entity) {
return sysMenuDao.updateMenu(entity);
}
更新 或 新增的同时清理相应的缓存数据,查询的频率相对来说是最高的。