缓存是为了减少数据库和服务器压力而产生的,在应用层编程时需主要考虑以下几种情况:

  • 客户端缓存

  • 服务端缓存

  • 网络缓存(CDN缓存)

客户端缓存负责减轻服务端的存储和频繁的数据请求等压力。

例如,在QQ初始阶段,只有“会员”才可以把QQ表情存储在“云端”之上,因为腾讯内部并没有庞大的存储系统存储大量的QQ表情。

虽然现在腾讯已经取消了只有“会员”才可以存储QQ表情的限制,但是大部分QQ表情仍然默认存储在本地客户端。

客户端缓存大致可分为以下几种:

  • 客户端本地文件缓存,包括图片、.txt文件、.doc文件等。

  • 客户端本地HTTP、cookie等浏览器缓存。

  • 客户端注册表。

  • 客户端微型数据库(SQLite)。

  • 客户端本地计算机内存。

服务端缓存主要是为了减少数据库压力和外部服务接口的压力,这也是实际编程中最常用的手段。

除减少数据库的压力外,缓存返回数据的响应速度比数据库要快。另外,尽可能不调用外部接口,因为外部接口无论WebSocket、WebService,还是HTTP,其响应速度都是不可控的。如果外部接口响应时间过长,也会影响自身性能。

服务端缓存大致分为以下几种:

  • 容器缓存,如Tomcat、Nginx、JBoss、Servlet等。

  • 中间件缓存,如MongoDB、Elasticsearch、Redis、RocketMQ、Kafka、ZooKeeper等。

  • JDK缓存,如磁盘缓存、堆内缓存、堆外缓存等。

  • 页面静态化缓存,如FreeMaker、Thymeleaf等。

  • 文件管理,如FastDFS等。

01 缓存的命中率

缓存的命中率指的是“缓存查询的次数”与“总查询次数”的比值。

在多级缓存下,可以调研每一级缓存的命中率,以便调整代码。若某缓存命中率过低,则很可能是缓存穿透问题。

02 缓存回收方式

  • 基于时间:当某缓存超过生存时间时,则进行缓存回收。或者当某缓存最后被访问后超过某时间仍然没有被访问,则进行缓存回收。

  • 基于空间:当缓存超过某大小时,则进行缓存回收。

  • 基于容量:当缓存超过某存储条数时,则进行缓存回收。

  • 基于引用:软引用和弱引用缓存会在JVM堆内存不足时进行缓存回收。

03 缓存回收策略

  • 先进先出(First In First Out,FIFO):一种简单的淘汰策略,缓存对象以队列的形式存在,如果空间不足,就释放队列头部的(先缓存)对象,一般用链表实现。

  • 最近最久未使用(Least Recently Used,LRU):是根据访问的时间先后进行淘汰的,如果空间不足,就释放最久没有被访问的对象(上次访问时间最早的对象)。

  • 最近最少使用(Least Frequently Used,LFU):根据最近访问的频率进行淘汰,如果空间不足,就释放最近访问频率最低的对象。

04 缓存的设计模式

(1)Cache Aside模式: 首先读取缓存中的数据,若缓存没有命中,则读取DB。当DB需要更新时,直接删掉缓存中的数据。由于实现简单,因此是最常用的一种设计模式,适用于读操作多的情况。

(2)Read/Write through模式: 在读取时先到缓存中查询数据是否存在。如果存在,则直接返回。如果不存在,则由缓存组件负责从数据库中同步加载数据,此数据永不过期。在写入时,先查询要写入的数据在缓存中是否存在。如果存在。则更新缓存中的数据,并且由缓存组件把数据同步更新到数据库中。Read/Write through模式初步屏蔽了底层数据库操作,但是当把数据从缓存组件写入DB时,有可能出现异常无法正确写入的情况。因而需要谨慎记录时间戳,以便跟踪维护处理数据。该方案适合对持久性要求较低的业务场景。

(3)Write Behind Caching(Write Back)模式: Write Behind Caching模式属于Read/Write through模式的进阶版,完全不考虑DB,增删改查全部通过缓存进行处理。如果读取不到数据,则直接认为该数据不存在,服务器会定期把缓存中的数据存储到DB中。一般高并发应用程序最常用的是Write Behind Caching设计模式,它是性能最好的设计模式,但是实现较为复杂,一旦服务器宕机则有可能导致大量数据丢失。

05 缓存测试应涵盖的内容

(1) 当前程序是否有可能出现缓存穿透、缓存击穿、缓存雪崩等常见问题。

(2) 缓存是否设置了最大位数及时间等功能,是否会出现内存溢出的现象。

(3) 缓存能够节省各数据源多少比重的读取,例如进程内缓存节省了多少读取Redis的比重,Redis缓存节省了多少读取磁盘缓存的比重,磁盘缓存节省了多少读取MySQL的比重。

(4) App在无网或弱网环境下,是否可以正常打开及使用。例如网易云音乐在没有网络的情况下可以听一些本地缓存的歌曲。

(5) App在弱网转正常网络之后,缓存是否能被正常覆盖。

(6) 各级缓存与数据库是否能够保持数据一致性,是否包含脏读、不可重复读等相关问题。

(7) 缓存是否能够被手动删除或刷新,若遇到紧急状况是否能够进行可逆性操作。

(8) 缓存的回收策略、回收方式等内容是否正常生效。

本书摘自《高性能Java架构:核心原理与案例实战》 一书,欢迎阅读此书了解更多高性能Java架构的内容。

高性能Java架构:核心原理与案例实战

张方兴 著

本书是按照程序设计与架构的顺序编写的,共13章。

第1章介绍学习高性能Java应了解的核心知识,为前置内容。

第2章和第3章讲解在编写代码之前,如何高效地为MySQL填充亿级数据,并对MySQL进行基准测试,以便在之后编程时有所比较。

第4章讲解在编写代码的过程中如何优化代码,使代码更高效。

第5章和第6章讲解在写好代码之后如何测试并优化场景响应速度。

第7章和第8章讲解在程序上线执行一段时间之后如何对MySQL进行主从复制、分库分表。

第9章讲解如何通过Prometheus和Grafana监控MySQL节点。

第10章和第11章讲解如何通过堆内缓存、堆外缓存(MapDB)和磁盘缓存解决MySQL数据库性能不佳的问题。

第12章讲解如何使用分布式锁Redisson解决实际应用中常见的数据一致性问题。

第13章简要介绍Java中的常见架构与工具。

本书不仅适合Java初学者、刚入行的编程人员,也适合对高性能、高并发感兴趣的程序员。

抽奖赠书

截止时间:2021年9月20日 17:00

如何抽奖:点击下方卡片,关注并回复关键词 :20210916

下次你更希望我们送哪本书呢?

留言告诉我们!

缓存核心知识小抄,面试必备,赶紧收藏!相关推荐

  1. java中线程调度遵循的原则_深入理解Java多线程核心知识:跳槽面试必备

    多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关 ...

  2. 深入理解 Java 多线程核心知识:跳槽面试必备

    作为一个 Java 开发人员,多线程是一个逃不掉的话题,不管是工作还是面试,但理解起来比较模糊难懂,因为多线程程序在跑起来的时候比较难于观察和跟踪.搞懂多线程并发知识,可以在面试的时候和周围人拉开差距 ...

  3. 阿里深资架构师整理的Java 基础知识小抄 赶紧收藏

    本篇算是 Java 的基础知识小抄吧,之所以说小抄是因为觉得涵盖不是很细很全,但是基本的内容都有,当然后头还会继续完善,只是不会再用笔记录了!按照现在的习惯,先附上一张思维导图: 1. 安装与环境配置 ...

  4. Java多线程知识小抄集(二)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  5. Java多线程知识小抄集(四)——完结

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  6. Java多线程知识小抄集(三)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. Java多线程知识小抄集(一)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  8. 电大计算机网考怎么过,史上最牛--电大计算机网考小抄(考试必备)--2016.09.08【呕心沥血整理、电大考试必过】.doc...

    史上最牛--电大计算机网考小抄(考试必备)--2016.09.08[呕心沥血整理.电大考试必过] 计算机网考Windows操作系统及其应用-选择题B A.Ctrl + Alt B.Ctrl + Shi ...

  9. 专升本考试计算机知识小抄,大学考试让带“小抄”,学生却说不如闭卷…原因亮了!...

    想到期末考试开卷,是不是很兴奋?但是最近,浙江工业大学的一场"开卷"考试火了,结果很多学生大呼:还不如闭卷!怎么回事? 近日, 浙江工业大学考试 允许带一页"小抄&quo ...

最新文章

  1. python traceback安装_Python错误:Traceback (most recent call last):感觉是软件出了问题
  2. Javascript正则匹配不含某子串
  3. php文件数组,从文件到数组php
  4. SpringMVC:后台将List转为Json,传值到页面
  5. python list 去重_Python中对列表list去重
  6. Boost:boost::asio模块的引用计数测试程序
  7. ansys变形太夸张_航母上的一颗铆钉能换一辆奥迪?太奢侈了
  8. 经常使用的 WEB server
  9. Selenium2+python自动化18-加载Firefox配置
  10. Atitit if else 选择决策流程ast对比 sql java 表达式类型 binaryExpression hase left and rit expr 目录 1.1. Sql 1
  11. Malmquist指数DEAP2.1应用
  12. QCC3040---如何设置PIO为中断
  13. 自定义智能报表系统内容准备:基于WEB的SBO数据结构浏览器
  14. 机场安检 matlab实现,机场安检过程改进的方案.doc
  15. 有1234四个数字java_用java程序编写,1234这四个数进行排列组合,
  16. KaliLinux-Recon-ng 5.1.1 使用详解
  17. 归来仍少年•青春不散场 | CEO刘其东出席同济经管学院2022级新生入学典礼及2022年毕业典礼
  18. 活动详情页面html代码,折扣活动详情.html
  19. Java基础(一) 八大基本数据类型
  20. excel中DATE(year,month,day)函数——oracle自定义函数

热门文章

  1. WinCE设置DataGrid行高
  2. 一个DBA的工作写照
  3. 程序人生系列之新闻发布系统 在网站部署经验分享
  4. N900 Dual boot(meego maemo)
  5. 大家都纷纷指出了 wp7 的优点 …
  6. 总结下我所学 设计模式
  7. vector机器人 HOW TO MEET VECTOR 如何满足向量
  8. golang 可变参 不定参 函数 简介
  9. java 反序列化工具 marshalsec改造 加入dubbo-hessian2 exploit
  10. mysql 区分大小写(大小写敏感)配置