zoukankan      html  css  js  c++  java
  • 28、springboot——缓存之JSR107——基于注解的缓存使用②

    一、使用缓存:

    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:两个都是指定缓存组件的名字,即将方法返回的结果然如哪个缓存组件中;可以指定放入多个缓存组件
         *              因为CacheManager管理多个Cache组件,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一的名字
         *          2、key:缓存数据使用的key,这个key对应着一个缓存数据,默认是使用方法参数的值作为key
         *              可以使用SpEL获取方法参数的值,举例:①#id:方法中参数id的值、②a0或者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查询,之后是在缓存中直接获取的

  • 相关阅读:
    Selenium快速入门(下)
    Selenium快速入门(上)
    Python中yield和yield from的用法
    Python多进程
    Spring Cloud微服务安全实战_3-5_API安全之常见问题
    Spring Cloud微服务安全实战_3-3_API安全之流控
    Spring Cloud微服务安全实战_3-2_第一个API及注入攻击防护
    Spring Cloud微服务安全实战_3-1_API安全 常见的安全机制
    Spring Cloud微服务安全实战_2-1_开发环境
    Spring Cloud微服务安全实战_1-1_导学
  • 原文地址:https://www.cnblogs.com/lyh233/p/12556315.html
Copyright © 2011-2022 走看看