【高并发】面试官:说说缓存最关心的问题?有哪些类型?回收策略和算法?...
写在前面
往往开始做一个项目时,不会过多的考虑性能问题,以快速迭代功能为主。后续随着业务的快速发展,系统运行的性能越来越慢,此时,就需要对系统进行相应的优化,而效果最显著的就是给系统加上缓存。那么,问题来了,当你为系统加上缓存时,有没有考虑过使用缓存需要注意哪些事项呢?
缓存命中率
缓存命中率是从缓存中读取数据的次数与总读取次数的比率,命中率越高越好。缓存命中率=从缓存中读取次数 / (总读取次数 (从缓存中读取次数 + 从慢速设备上读取次数))。这是一个非常重要的监控指标,如果做缓存,则应通过监控这个指标来看缓存是否工作良好。
缓存类型
缓存类型总体上来看,可以分为:堆缓存、堆外缓存、磁盘缓存和分布式缓存。
堆内存
使用Java堆内存来存储对象。使用堆缓存的好处是没有序列化/反序列化,是最快的缓存。缺点也很明显,当缓存的数据量很大时,GC(垃圾回收)暂停时间会变长,存储容量受限于堆空间大小。一般通过软引用/弱引用来存储缓存对象。即当堆内存不足时,可以强制回收这部分内存释放堆内存空间。一般使用堆缓存存储较热的数据。可以使用Guava Cache、Ehcache 3.x、 MapDB实现。
堆外内存
即缓存数据存储在堆外内存,可以减少GC暂停时间(堆对象转移到堆外,GC扫描和移动的对象变少了),可以支持更多的缓存空间(只受机器内存大小限制,不受堆空间的影响)。但是,读取数据时需要序列化/反序列化。因此,会比堆缓存慢很多。可以使用Ehcache 3.x、 MapDB实现。
磁盘缓存
即缓存数据存储在磁盘上,在JVM重启时数据还存在,而堆/堆外缓存数据会丢失,需要重新加载。可以使用Ehcache 3.x、MapDB实现。
分布式缓存
分布式缓存可以使用ehcache-clustered(配合Terracotta server)实现Java进程间分布式缓存。也可以使用Memcached、Redis实现。
使用分布式缓存时,有两种模式如下:
单机模式:存储最热的数据到堆缓存,相对热的数据到堆外缓存,不热的数据到磁盘缓存。
集群模式:存储最热的数据到堆缓存,相对热的数据到对外缓存,全量数据到分布式缓存。
缓存回收策略
缓存的回收策略总体上来说包含:基于空间的回收策略、基于容量(空间)的回收策略、基于时间的回收策略和基于对象引用的回收策略。
基于空间
基于空间指缓存设置了存储空间,如设置为10MB,当达到存储空间上限时,按照一定的策略移除数据。
基于容量
基于容量指缓存设置了最大大小,当缓存的条目超过最大大小时,按照一定的策略移除旧数据。
基于时间
TTL(Time To Live):存活期,即缓存数据从创建开始直到到期的一个时间段(不管在这个时间段内有没有被访问,缓存数据都将过期)。TTI(Time To Idle):空闲期,即缓存数据多久没被访问后移除缓存的时间。
基于对象引用
软引用:如果一个对象是软引用,则当JVM堆内存不足时,垃圾回收器可以回收这些对象。软引用适合用来做缓存,从而当JVM堆内存不足时,可以回收这些对象腾出一些空间供强引用对象使用,从而避免OOM。弱引用:当垃圾回收器回收内存时,如果发现弱引用,则将它立即回收。相对于软引用,弱引用有更短的生命周期。
注意:只有在没有其他强引用对象引用弱引用/软引用对象时,垃圾回收时才回收该引用。即如果有一个对象(不是弱引用/软引用对象)引用了弱引用/软引用对象,那么垃圾回收时不会回收该弱引用/软引用对象。
回收算法
使用基于空间和基于容量的缓存会使用一定的策略移除旧数据,通常包含:FIFO算法、LRU算法和LFU算法。
FIFO(First In First Out):先进先出算法,即先放入缓存的先被移除。
LRU(Least Recently Used):最近最少使用算法,时间时间距离现在最久的那个被移除。
LFU(Least Frequently Used):最不常用算法,一定时间段内使用次数(频率)最少的那个被移除。
实际应用中基于LRU的缓存居多。
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
长按订阅更多精彩▼如有收获,点个在看,诚挚感谢
【高并发】面试官:说说缓存最关心的问题?有哪些类型?回收策略和算法?...相关推荐
- 高并发面试 - 如何设计一个高并发系统?
高并发面试 - 如何设计一个高并发系统? 面试题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里 ...
- 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记
<Java并发编程入门与高并发面试>or <Java并发编程与高并发解决方案>笔记 参考文章: (1)<Java并发编程入门与高并发面试>or <Java并发 ...
- Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库
前言 最近在做阅读类的业务,需要记录用户的PV,UV: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的原始数据,三要素: 谁 在什 ...
- 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!
写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...
- 面试官:缓存穿透、缓存雪崩和缓存击穿是什么?
前言 原创公众号:bigsai 对于缓存穿透.缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是啥吧? redis缓存穿透 理解 重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个 ...
- 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!...
写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...
- 高并发场景下的缓存有哪些常见的问题?
作者 l 丁码农 来源:https://www.cnblogs.com/dinglang 一.缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副 ...
- 高并发处理方案_高并发系统下的缓存解决方案
什么样的数据适合做缓存? 缓存和DB数据一致性在之前已讲过,详细可参考下面阅读推荐<如何保障mysql和redis之间的数据一致性>,我们这里讲一讲缓存穿透.缓存雪崩和击穿的三种场景解决方 ...
- 高并发场景下的缓存 + 数据库双写不一致问题分析与解决方案设计
在实际业务中,经常碰见数据库和缓存中数据不一致的问题,缓存作为抵挡前端访问洪峰的工具,用的好的话可以大大减轻服务端压力,但是在一些场景下,如果没有控制好很容易造成数据库和缓存的数据不一致性,尤其是在并 ...
最新文章
- poj_2479 动态规划
- KVM(1)- 安装
- .NET可变性解析(协变和逆变)
- JavaScript(二)——数据类型、流程控制、Map和Set
- 有限元笔记02:第三章
- linux远程测试题,linux内训考试题及答案
- pycharm遇到的小问题
- js,vue.js一些方法的总结
- 中职计算机基础课教学策略研究,计算机-研究教学方法中职学校计算机基础课程教学策略的论文开题报告-优度********网...
- 移动硬盘加上密码_树莓派+Seafile+移动硬盘搭建私有云
- 几张图来好好理解Spring的循环依赖
- 360无痕浏览器_功能强大好用的浏览器
- nmos和pmos导通条件
- RGB-D相机(Azure Kinect DK)RGB图、深度图的获取,配准与保存
- excel引用其他表数据
- 技术型人才如何选择创业?
- pandas模块的统计指标--实现众数和众数的频数
- 速看!!带你揭秘3D建模行业内幕!!
- centos7重启桌面服务_centos7安装ghome桌面以及配置vcn服务
- 定制纳米储氢材料NdNi4.8Sn0.2/CNTs纳米碳管复合储氢材料/膨胀石墨/LiBH4复合储氢材料
热门文章
- java layoutinflater_LayoutInflater(布局服务)
- linux+swig+python,linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)...
- java common.lang_Java 开源工具 Apache Common Lang
- 华为交换机ssh思科交换机_思科交换机交换机中ip、mac地址绑定
- mysql的crud语句_MySQL数据库CRUD语句快速入门
- 【Java】Cloneable 接口讲解 (包含浅拷贝与深拷贝不一样的实现讲解)
- Python模块-创建和执行程序(或者脚本)
- HDU1106字符串排序题
- NC14414 小AA的数列
- mysql 分组 列转行_mysql列转行以及年月分组实例