缓存与性能的一些思考

作者:蔡舒

导语

身为码农,缓存大概是我们接触最频繁的概念之一了。 当读写性能不达标,我们也许会脱口:做缓存策略吧,性能会大幅提升的; 当发现缓存命中率不足时,我们也许会脱口而出:提升命中率吧,性能会大幅提升的; 但事实确实如此吗?会不会其他方法会工作的更好?下面是我的一些数据分析,希望能给大家带来一些灵感与思考。

公式

命中率 = 缓存命中次数/请求总数 时延 = 命中率×缓存时延 (1-命中率)×(缓存时延 失效时延) QPS = 线程数/时延

一个例子

假设我们运行了一个单线程的数据服务,单请求的延迟为 100ms,qps 为 10;做了缓存策略之后,命中缓存的情况下,单请求的延迟为 0.1ms,qps 为 10000。我们用服务的平均 qps 来代表其性能,下表为性能和缓存命中率的关系:

缓存命中率

性能(QPS

0%

9.99

20%

12

50%

19

70%

33

90%

99

92%

123

95%

196

96%

243

97%

322

98%

476

99%

909

100%

1000

从表格中,可以发现一些有趣的现象:当我们把缓存命中率从 20%提升到 50%,带来的性能提升还不到 60%。而当命中率从 98%提升到 99%,仅仅一个百分点,性能提升就达到了近一倍!

缓存与性能的关系

上面的分析,说明了缓存命中率和性能并不是一个线性关系。缓存与性能的关系曲线如下图所示。当缓存层级间速度差异越大,此曲线越陡峭。

指导意义

  • 只有当缓存命中率达到 80%以上,才会有明显的性能提升。命中率为 80%,性能提升约 3~5 倍;命中率为 90%,性能提升约 5~10 倍;
  • 缓存命中率与业务场景有关,局部性越强,缓存性能提升越大。对于完全随机的业务,缓存策略提升不大,甚至拖累性能;
  • 对于特定业务,如果缓存命中率达到 80%甚至 90%以上,优化缓存命中率可以得到巨大的性能提升;
  • 对于特定业务,如果缓存命中率不到 70%,优化未命中缓存时的业务性能更靠谱。比如换 SSD,优化算法等;
  • 高性能存储系统,比如数据库服务,一定要预留大量可用系统内存以供页缓存使用。一旦内存不够,则性能将会大大折扣。比如系统内存不足,导致页缓存命中率从 99%跌到 95%,性能会下降五倍之多;
  • SSD 是个好东西。对于纯随机的读写服务,SSD 比缓存要靠谱得多;
  • 对于局部性不太强的业务,二级缓存、三级缓存也是有用的,如果一级缓存命中率不高,多加几层缓存也可使得每一层缓存间的命中率达到 90%以上。

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算

异步数据存储声明

在过去的几年里,NoSQL数据存储的工作让我对应用程序的方向有了一些见解,因为NoSQL成为了主流的数据存储和检索方法,至少对网络和基于云的程序来说是这样的(企...

1999
来自专栏PHP技术

缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作...

30713
来自专栏斑斓

大数据系统的Lambda架构

在大数据处理系统中,如何有效地将real time与batch job结合起来,既发挥前者对响应的实时性,又能解决对海量数据的分析与处理?答案就是Lambda架...

3979
来自专栏北京马哥教育

NoSQL之mongodb我见

NoSQL介绍: NoSQL数据管理系统是目前非常流行的一种非关系性、分布式、不支持ACID设计规范式的数据库;NoSQL简单的数据模型、元数据和数据分离、弱一...

2849
来自专栏企鹅号快讯

Java程序员修炼之路线程篇之终篇

Java程序员修炼之路线程篇之终篇 在头条上撰写了20多篇关于java线程的文章,收获了很多读者的肯定和鼓励,在此表示感谢!特别感谢持续关注我,转发我的文章并给...

1778
来自专栏码神联盟

架构 | 大型网站分布式高并发架构设计汇总

本文多数内容为小编精心总结,呕心沥血完成,切勿抄袭沿用。 参考文献《架构知识》、《深入理解java》 ---- 章节目录: 前言 前端架构 应用层架构 服务层架...

4338
来自专栏全华班

认识工作流-Activiti详细说明

阅读文本大概需要 5 分钟。 一、Activiti详细说明 ? 首先给大家介绍一下BPMN2规范的分类分为几个部分。 1启动与结束事件、2顺序流、3任务、4网...

3458
来自专栏成猿之路

从零讲JAVA ,给你一条清晰地学习道路!该学什么就学什么!!

本文转载java知音

822
来自专栏Spark学习技巧

从零讲Java,给你一条清晰地学习道路!该学什么就学什么!

1005
来自专栏微信公众号:Java团长

从零讲Java,给你一条清晰地学习道路!该学什么就学什么!

主要学习: 1.向量,链表,栈,队列和堆,词典。熟悉 2.树,二叉搜索树。熟悉 3.图,有向图,无向图,基本概念 4.二叉搜索A,B,C类熟练,9大排序熟悉。 ...

371

扫码关注云+社区