写点什么

在使用缓存时应该注意哪些问题?

  • 2015-09-21
  • 本文字数:882 字

    阅读完需:约 3 分钟

缓存是个好工具。许多有用的数据都适合放在内存中。那样可以降低延迟,减轻数据库负载,减少硬件成本。但实际上,缓存的成本很高,只是软件开发人员往往低估了缓存带来的问题和复杂度提升。近日,来自 Twitter 的软件工程师 Mike Solomon 发表了一篇博文,从以下几个方面分析了实现缓存的困难之处:

  • 缓存数据更难以推断:缓存意味着不从真实数据源读取数据。因此,每次读或写缓存数据都可能与真实数据源不匹配。在问题追踪时必须经常考虑这种情况。
  • 缓存数据可能导致“视角(perspective)”Bug:比如,一个新闻站点上有个“最佳文章”列表,其中的内容可能会随登录用户的不同而变化。一个常犯的缓存错误是缓存的数据独立于视角,具有不同视角的用户看到了相同的内容。这会导致严重的隐私甚或安全问题。
  • 涉及缓存的行为难以重现:当引入缓存,就引入了一个新的层,其上的行为可能同预期不符。缓存对象依赖访问模式,会随时间或其它因素变化。一旦出现问题,很难通过重现行为来帮助问题修复。
  • 访问模式变化可能会损害性能:访问模式变化可能会莫名其妙地导致缓存命中率降低,延迟增加,吞吐量减少。但流量水平可能会保持不变,这屏蔽了问题原因,潜在地增加了底层数据源的负载及问题处理的难度。
  • 进程内缓存可能会增加 GC 压力:在具有垃圾收集功能的语言中,大量长寿命的缓存对象会增加垃圾收集的时间和次数。
  • 缓存失败恢复困难:缓存机器故障,存储在内存中的数据就会丢失,无法简单地重新上线。在缓存重新创建的过程中,吞吐量可能会下降。

尽管缓存有着这些困难,但还是需要它,比如, Facebook、Twitter、Instagram 及 Reddit 都将缓存视为一个关键的基础设施。Facebook 基础设施工程师已经构建了一个名为 mcrouter 的工具用于管理缓存。该工具开源不到一年,就获得了1000 多颗星,缓存的重要性可见一斑。只是,在考虑使用缓存的时候需要注意上述问题。


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-09-21 19:004182
用户头像

发布了 1008 篇内容, 共 426.2 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

架构入门感悟之十一

笑春风

上地七街

潇潇雨歇

架構師訓練營 大作業一

ilake

分析了2020年3万多条的微博热搜,我看到了什么

CoderW

Python 程序人生 爬虫 后端 微博热搜

交报告 | 2020年读完的50本书

程序猿Billgo

想法

BerryMew

一次线上cpu过高问题

kcnf

在 Emit 代码中如何await一个异步方法

八苦-瞿昙

第九周 作业1

Mr_No爱学习

第九周-学习总结

Mr_No爱学习

架構師訓練營 大作業二

ilake

探讨典型互联网系统使用的技术方案

Andy

架构师大作业

_

大作业 架构师训练营第 1 期

2021你好 | 一名五道口程序员的年终总结

程序员贺同学

程序员 职场 自媒体 年终总结 新年

Spring 源码学习 12:registerBeanPostProcessors

程序员小航

Java spring 源码

架构师训练营第十一周作业

丁乐洪

【计算机内功修炼】二:读取文件时,程序经历了什么

码农的荒岛求生

后端 文件 操作系统 进程 线程’

区块链游戏开发注意事项

CECBC

区块链 区块链游戏

架构师训练营第十一周作业

李日盛

系统安全高可用总结

Mars

系统高可用原因分析&方案

Mars

【计算机内功修炼】一:看完这篇还不懂线程与线程池你来打我

码农的荒岛求生

高并发 线程池 进程 高性能 线程’

时间戳——区块链不可篡改特性的重中之重

CECBC

区块链

意想不到,这个神奇的bug让我加班到深夜

码农的荒岛求生

bug修复

数字版权资源价值日益凸显

CECBC

版权保护

数据爬虫

RainGod

爬虫

RocketMQ避坑指南:你部署的RocketMQ集群真的是高可用?

中间件兴趣圈

架构 RocketMQ 故障分析 消息队列

从考研失败到最具成长力员工,这个2020就像过山车一样

Java鱼仔

程序员 面试 程序人生 考研

第一周架构方法-练习-食堂就餐卡系统设计

潘涛

架构师训练营 4 期

架构师训练营第十一周笔记

李日盛

笔记

LeetCode题解:264. 丑数 II,暴力法,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

在使用缓存时应该注意哪些问题?_语言 & 开发_谢丽_InfoQ精选文章