使用缓存的几个注解

  什么时候需要使用缓存呢?一般是在一个方法的返回值需要被频繁用到、但是返回值很少改变而且执行这个方法会消耗较多的时间,这种情况我们可以考虑将返回值暂时存到内存中,需要时通过对应的唯一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,到某一时刻自动删去缓存中的数据即可。

springboot cache---本地缓存的使用的更多相关文章

  1. Guava Cache 本地缓存组件浅析

    cache组件中核心的类和接口列举如下: 接口: Cache 本地缓存的顶级接口,提供一些对缓存进行get,put的方法,以及获取缓存统计数据的方法等. LoadingCache 继承了Cache接口 ...

  2. springboot之本地缓存(guava与caffeine)

    1. 场景描述 因项目要使用本地缓存,具体为啥不用redis等,就不讨论,记录下过程,希望能帮到需要的朋友. 2.解决方案 2.1 使用google的guava作为本地缓存 初步的想法是使用googl ...

  3. Guava Cache本地缓存

    Guava介绍 Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库. 这个库是为了方便编码,并减少编码错误. 这个库提供用于集合,缓存,支持原语,并发性,常见注解,字 ...

  4. 第七章 企业项目开发--本地缓存guava cache

    1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...

  5. 使用Guava cache构建本地缓存

    前言 最近在一个项目中需要用到本地缓存,在网上调研后,发现谷歌的Guva提供的cache模块非常的不错.简单易上手的api:灵活强大的功能,再加上谷歌这块金字招牌,让我毫不犹豫的选择了它.仅以此博客记 ...

  6. 企业项目开发--本地缓存guava cache(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分 ...

  7. Springboot中的缓存Cache和CacheManager原理介绍

    背景理解 什么是缓存,为什么要用缓存 程序运行中,在内存保持一定时间不变的数据就是缓存.简单到写一个Map,里面放着一些key,value数据,就已经是个缓存了 所以缓存并不是什么高大上的技术,只是个 ...

  8. 使用guava cache在本地缓存热点数据

    某些热点数据在短时间内可能会被成千上万次访问,所以除了放在redis之外,还可以放在本地内存,也就是JVM的内存中. 我们可以使用google的guava cache组件实现本地缓存,之所以选择gua ...

  9. 【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

  10. 本地缓存解决方案-Caffeine Cache

    1.1 关于Caffeine Cache ​ Google Guava Cache是一种非常优秀本地缓存解决方案,提供了基于容量,时间和引用的缓存回收方式.基于容量的方式内部实现采用LRU算法,基于引 ...

随机推荐

  1. 使用tushare获取股票历史数据和实时分笔数据

    使用tushare获取股票历史数据和实时分笔数据   财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据 ...

  2. BUFFER CACHE和SHARED POOL原理

    http://blog.csdn.net/wanghai__/article/details/4881492 Buffer Cache LRU与Dirty List 在Buffer Cache中,Or ...

  3. P3928奶酪

    传送 今天早晨,神志不清的我决定拿头过这道题 终于在wa了6次之后过了 emm  明明都是一些细节自己却注意不到啊啊啊不能再颓了!!!!!!!!!!!! 好了回归正题 首先我们要开long long ...

  4. java日期处理的一些例子使用...

    一.计算成为会员多少天 需求:根据会员的创建日期createTime,计算成为会员多少天. 计算:当前日期 - 创建日期,转化为天数,即为成为会员多少天. 代码: public static void ...

  5. k8s创建资源

        一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源:   1.用 kubectl 命令直接创建(适用于少数的pod创建) kubectl run httpd- ...

  6. clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈

    clientdataset 读取excel   如果excel 文件不存在的时候   相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据.   这是一个bug 哈哈

  7. 【Android Studio安装部署系列】十三、Android studio添加和删除Module 2

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 新建.导入.删除Module是常见的操作,这里简单介绍下. 新建Module File——New——New Module... 选中 ...

  8. Appium-入门实例1

    参考:(https://blog.csdn.net/zh175578809/article/details/76862590) 第一步:启动虚拟设备 在运行App之前,首先需要创建一个Android模 ...

  9. 【Unity Shader】---入门知识点

    着色器声明(“名字”)Shader "ShaderDiffuseExample" { 一.属性定义(作用:外部传入参数) 属性定义语法:PropName("Display ...

  10. C++食物链【NOI2001】 并查集+建虚点

    B. 食物链[NOI2001] 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了 ...