• springboot cache---本地缓存的使用


    使用缓存的几个注解

      什么时候需要使用缓存呢?一般是在一个方法的返回值需要被频繁用到、但是返回值很少改变而且执行这个方法会消耗较多的时间,这种情况我们可以考虑将返回值暂时存到内存中,需要时通过对应的唯一key获取,从而提高程序效率。与之前类似,使用缓存首先要在启动类上面写上注解@EnableCaching,然后在需要将返回值缓存起来的方法上面加上@Cacheable、@CachePut、@CahcheEvict注解。

      @Cacheable

      表示执行这个方法前,先尝试到缓存中取值,如果缓存中没有然后再执行方法,并且在执行完毕后将结果缓存。一般加在查询数据的方法上面。

    public class Cache {
        @Cacheable(cacheNames="user",key="#id")  ////cacheNames="user"这个参数是指定缓存的名字,通过el表达式将下面方法的参数拿来作为key
        public User getUserById(Long id) {
            //查询返回一个User示例
        }
    }

      @CachePut

       有这个注解的方法被调用时,不会从缓存中去找、取值,而是直接执行方法,并将结果更新到缓存中。就是奔着更新缓存去的。一般加在更新数据的方法上面。

       @CachePut(cacheNames="user",key="#u.id")
        public User updateUserById(User u) {
            //更新某条记录
        }

      @CacheEvict

      有这个注解的方法被调用时,会根据key删除缓存中的值。就是奔着删除缓存去的。一般加在删除数据的方法上面。删除所有数据注意加个参数allEntries=true。

      @CacheEvict(cacheNames="user")
        public User deleteUserById(Long id) {
            //删除某条记录
        }
    
        @CacheEvict(cacheNames="user",allEnties = true)  //删除所有数据的话,加个allEntries=true表示删除缓存中所有值
        public User deleteAll() {
            //删除所有数据
        }

       @CacheConfig

      所有方法都需要指定目标缓存的名字,有点麻烦。我们可以把指定缓存名字的注解放到这些方法所属的类的上面。

    @CacheConfig("user")
    public class Cache {
    
        @Cacheable(key="#id")   //类上指定了缓存名字,这里不需要指定了
        public User getUserById(Long id) {
            //获取某条记录
        }
    }

    关于key的生成

      1. key其实是默认自动生成的,根据方法的所有参数进行摘要算出一个唯一性的key。

      2. 我们可以设置keyGenerator自定义key的生成方式。

      3. 最常用的就是上面的用EL表达式拿到一个或若干个参数列表的形参作为key。

    条件缓存

      如果不想每次调用方法都用缓存,可以用condition参数在方法执行前对参数做一些限制,也可以用unless参数通过方法执行完毕后的结果做判断完成一些限制。

      @Cacheable(condition="id<10",unless="#result.state=0") 
        public User getUserById(Long id) {
            //查询返回一个User示例
        }

    上面的代码中,condition表达式表示:参数id<10的时候,@Cacheable注解才起作用,否则就是个普通方法。

           unless表达式表示:方法执行完毕后,获取结果中的state的值,为0则将结果缓存,否则对返回值不做缓存处理。

    设置缓存过期

      这个。。。@CacheEvict/@CachePut 结合上一篇中的使方法定时执行的注解@Scheduled,到某一时刻自动删去缓存中的数据即可。

  • 相关阅读:
    Git 远程分支的查看及相关问题
    Clean Code – Chapter 6 Objects and Data Structures
    Clean Code – Chapter 5 Formatting
    Clean Code – Chapter 4: Comments
    利用 SerialPort 控件实现 PC 串口通信
    Clean Code – Chapter 3: Functions
    oracle如何查看当前有哪些用户连接到数据库
    c++ Ansi和Unicode相互转换
    c++ Utf8和Unicode相互转换
    c++ 根据某个字符或者字符串分割另外一个字符串
  • 原文地址:https://www.cnblogs.com/shen-qian/p/11468475.html
Copyright © 2020-2023  润新知