缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。我们把缓存分为两类:

  • 分布式缓存,例如Redis:

    • 优点:存储容量更大、可靠性更好、可以在集群间共享

    • 缺点:访问缓存有网络开销

    • 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享

  • 进程本地缓存,例如HashMap、GuavaCache:

    • 优点:读取本地内存,没有网络开销,速度更快

    • 缺点:存储容量有限、可靠性较低、无法共享

    • 场景:性能要求较高,缓存数据量较小

我们今天会利用Caffeine框架来实现JVM进程缓存。

Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine

Caffeine的性能非常好,下图是官方给出的性能对比:

可以看到Caffeine的性能遥遥领先!

缓存使用的基本API:

@Test
void testBasicOps() {// 构建cache对象Cache<String, String> cache = Caffeine.newBuilder().build();// 存数据cache.put("gf", "迪丽热巴");// 取数据String gf = cache.getIfPresent("gf");System.out.println("gf = " + gf);// 取数据,包含两个参数:// 参数一:缓存的key// 参数二:Lambda表达式,表达式参数就是缓存的key,方法体是查询数据库的逻辑// 优先根据key查询JVM缓存,如果未命中,则执行参数二的Lambda表达式String defaultGF = cache.get("defaultGF", key -> {// 根据key去数据库查询数据return "柳岩";});System.out.println("defaultGF = " + defaultGF);
}

Caffeine既然是缓存的一种,肯定需要有缓存的清除策略,不然的话内存总会有耗尽的时候。

Caffeine提供了三种缓存驱逐策略:

  • 基于容量:设置缓存的数量上限

// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder().maximumSize(1) // 设置缓存大小上限为 1.build();

基于时间:设置缓存的有效时间

// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder()// 设置缓存有效期为 10 秒,从最后一次写入开始计时 .expireAfterWrite(Duration.ofSeconds(10)) .build();
  • 基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用。

注意:在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。

初识Caffeine相关推荐

  1. 计算机笔记--【Redis高级】

    提示:本文章的内容来源于自己所学的一些知识以及网络 文章目录 一.分布式缓存 1.Redis持久化 1.1.RDB持久化(存数据) 1.1.1.执行时机 1.1.2.RDB原理 1.1.3.小结 1. ...

  2. HM-SpringCloud微服务系列11.1【多级缓存的意义JVM进程缓存】

    HM-SpringCloud微服务系列11:多级缓存-高级篇 1. 什么是多级缓存 多级缓存是亿级流量的缓存方案 浏览器访问静态资源时,优先读取浏览器本地缓存 访问非静态资源(ajax查询数据)时,访 ...

  3. Redis高级篇-多级缓存

    Redis高级篇资料下载 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat ...

  4. 黑马Redis笔记高级篇 | 多级缓存

    黑马Redis笔记高级篇 | 多级缓存(黑马教程云服务器踩坑记录) 1.JVM进程缓存(tomcat服务内部) 1.1 导入商品案例 1.2 初识Caffeine 1.3 实现进程缓存 2.Lua语法 ...

  5. Redis进阶学习08--多级缓存

    Redis进阶学习08--多级缓存 什么是多级缓存 JVM进程缓存 环境准备 docker安装mysql docker安装nginx 反向代理 初识Caffeine 实现JVM进程缓存 需求 实现 L ...

  6. SpringCloud补充与微服务面试题

    多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系 ...

  7. day3----编码-集合-深浅copy-文件操作-函数初识

    day3----编码-集合-深浅copy-文件操作-函数初识 本文档主要内容: 一 编码 二 集合 三 深浅copy 四 文件操作 五 函数初识 首先,我们来看看两个字符串的比较 打开cmd,进入do ...

  8. ⑥python模块初识、pyc和PyCodeObject

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  9. 初识java类的接口实现

    初识java类的接口实现 如果两个类之间不存在继承关系,且两个类都想实现同一个接口,两个类都必须实现接口中全部方法,否则报语法错误 如果两个类之间存在继承关系也想实现同一个接口,父类如果实现了某个接口 ...

最新文章

  1. java treemap get_java treeMap 排序后 get不到value
  2. IPad开发之有帮助的开发工具
  3. 关于Reporting Service中的Report builder的几个疑问,高手来解答下
  4. 用JScript.net写.net应用程序
  5. Golang的数组、切片、映射的理解
  6. 敏捷项目管理过程改进
  7. 社会工程学***的八种常用方法
  8. 微课|中学生可以这样学Python(7.3.3节):成员方法、类方法、静态方法
  9. java乱码问题详解-值得收藏
  10. MATLAB FOR PROE
  11. 阿里巴巴公布了一份最新的AI成绩单
  12. winform前后端框架_ABP开发框架前后端开发系列(1)框架的总体介绍
  13. Ubuntu18.04 + anaconda3 +python3.6+ 安装labelImg 标注
  14. 寻求 华中科大《机械控制工程基础》第五版习题参考答案
  15. 计算机程序设计员( 国家职业标准三级),计算机程序设计员国家职业标准
  16. 毕业论文给图、表格、公式编号(不设置多级列表)
  17. win10 截屏 快捷键(全屏直接保存、全屏间接保存、当前界面)
  18. php两个问号??表示什么意思
  19. 腾讯求职经历(后附大量面试题)
  20. Package com.myapp signatures do not match the previously installed version

热门文章

  1. Vue导入非模块化的第三方插件功能无效解决方案
  2. codeforce R 491 (div2)
  3. css3 :nth-child()选择器的使用
  4. tomcat启动时,报java.io.EOFException
  5. BZOJ1798: [Ahoi2009]Seq 维护序列seq
  6. Appium环境搭建python篇(mac系统)
  7. C#中Dictionary的用法
  8. MOSS2010站点大文件上传设置
  9. 【Java线程】互斥 同步 异步 并发 多线程的区别与联系
  10. BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)