一, 使用缓存:
1. 开启基于注解的缓存 @EnableCaching
2. 标注缓存即可
二, 具体实例
上一节创建好基本环境后每一次访问查询都会进行 sql 查询:
我访问三次上面的链接每次都会进行 sql 查询:
打印是在 service 中执行的
- @Service
- public class EmployeeService {
- @Autowired
- EmployeeMapper employeeMapper;
- public Employee getEmp(Integer id){
- System.out.println("查询"+id+"号员工");
- Employee employee = employeeMapper.getEmpById(id);
- return employee;
- }
- }
想要看到具体的 sql 执行语句可以修改 mapper 包的日志级别 (即在 application.xml 中添加配置):
- # 指定 mapper 包下的日志级别
- logging.level.com.atguigu.cache.mapper=debug
再次在浏览器中访问三次查询链接, 此时控制台的输出为:
通过控制台可以看到, 我们每次查询相同的数据时服务器端都执行 sql 查询, 这样有时候效率会低;
所以必要时我们需要用到缓存
1, 在上一节的基础上在主程序上开启缓存:
- @EnableCaching
- @MapperScan("com.atguigu.cache.mapper")
- @SpringBootApplication
- public class Springboot01CacheApplication {
- public static void main(String[] args) {
- SpringApplication.run(Springboot01CacheApplication.class, args);
- }
- }
2, 在 service 层的方法中使用 @Cacheable 注解
- @Service
- public class EmployeeService {
- @Autowired
- EmployeeMapper employeeMapper;
- /**
- * @Cacheable : 将方法的运行结果进行缓存; 以后再要相同的数据, 直接从缓存中获取, 不用调用方法了
- * 几个属性:
- * 1,cacheNames/value: 两个都是指定缓存组件的名字, cacheNames 可以指定这个缓存组件有多个名字
- * 因为 CacheManager 管理多个 Cache 组件, 对缓存的真正 CRUD 操作在 Cache 组件中, 每一个缓存组件有自己唯一的名字
- * 2,key: 缓存数据使用的 key, 这个 key 对应着一个缓存数据, 默认是使用方法参数的值作为 key
- * 可以使用 SpEL 获取方法参数的值, 举例:1#id: 方法中参数 id 的值,2a0 或者 p0 或者 #root.args[0]: 取出方法参数中第一个参数的值
- * 3,keyGenerator:key 的生成器: 默认用方法参数的值作为缓存的 key, 通过这个生成器生成
- * 可以自己指定 key 的生成器的组件 id 注意: key 属性和 keyGenerator 属性只能二选一使用
- * 4,cacheManager: 指定缓存管理器; 或者用 cacheResolver 指定缓存解析器 ; 这两个作用是一样; 使用时也是二选一
- * 5,condition: 指定符合条件的情况下才缓存;
- * 这里也可以使用 SpEL; 举例: condition = "#id> 0"
- * 6,unless: 当 unless 指定的条件为 true 时; 方法的返回值就不会缓存了 (正好与 condition 属性相反)
- * 可以获取到结果进行判断; 举例: unless = "#result == null"
- * 7,sync: 是否使用异步模式; 默认不使用
- */
- @Cacheable(cacheNames = {"emp"})
- public Employee getEmp(Integer id){
- System.out.println("查询"+id+"号员工");
- Employee employee = employeeMapper.getEmpById(id);
- return employee;
- }
- }
各个属性解释:
条件判断中 SpEL 的获取各个值的参考:
3, 重启项目再访问查询链接三次进行测试
但即使访问链接三次, 此时控制台也只有第一次的时候才会进行 sql 查询, 之后是在缓存中直接获取的
来源: http://www.bubuko.com/infodetail-3475461.html