写点什么

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

  • 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:003952
用户头像

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

关注

评论

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

char+char=number

喵叔

7月日更

大数据实战训练营作业一

Clarke

使用dubbo-go搭建dubbo接口测试平台

捉虫大师

dubbo 接口测试 dubbo-go Go 语言

Redis 的集群容错与故障转移

U2647

redis redis哨兵模式 集群 redis cluster Leader

【从零开始学爬虫】采集西瓜直播视频

前嗅大数据

大数据 爬虫 数据采集

基于迁移学习的语义分割算法分享与代码复现

华为云开发者联盟

语义分割 modelarts 迁移学习 语义分割算法 迁移分割

Linux之ln命令

入门小站

Linux

🐬【MySQL技术导航】常用函数介绍(1)

洛神灬殇

MySQL 7月日更

微信朋友圈高性能复杂度分析

木云先森

架构实战营

【架构训练营】模块二作业

zclau

[翻译]innodb_ruby 项目简介

keaper

MySQL 数据库 后端 服务端 innodb

Vue进阶(三十五):watch监听函数详解

No Silver Bullet

Vue 7月日更 watch

Python OpenCV 图像的几何变换,先说不平凡的 resize 函数

梦想橡皮擦

Python 7月日更

Rust从0到1-面向对象编程-概念

rust oop 面向对象编程

MERN堆栈

吴脑的键客

node.js mongodb React Express

浪潮云洲×天人集团:打通数据脉络 驱动降本增效

在线XML转CSV工具

入门小站

【Flutter 专题】80 初识 Flutter Stream (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

Vue进阶(幺玖肆):localStorage应用总结

No Silver Bullet

Vue LocalStorage 7月日更

Go语言,什么情况下应该使用指针?

微客鸟窝

Go 语言

【LeetCode】两个链表的第一个公共节点Java题解

Albert

算法 LeetCode 7月日更

华为云UGO正式公测:4大核心优势破解异构数据库迁移难题

华为云开发者联盟

数据库 华为云数据库 异构数据库 对象迁移 应用迁移

使用Docker运行OnlyOffice的Node.js示例

一个需求

onlyoffice

倒计时 | 7.24 阿里云 Serverless Developer Meetup 杭州站报名火热进行中!

Serverless Devs

阿里云 Serverless 云原生

大数据实战训练营作业二

Clarke

手把手教你在Modelarts平台上进行视频推理

华为云开发者联盟

视频 modelarts 推理 预处理 视频推理

微信朋友圈复杂度分析

桂阳

“吴痛针灸”代言人翻车,为什么女性会重新定义品牌优势

脑极体

现代企业架构师的5大特征及六种方法

禅道项目管理

架构 数据 开发 创新 行业趋势

云小课|ModelArts Pro 视觉套件:零代码构建视觉AI应用

华为云开发者联盟

AI 零代码 ModelArts Pro 行业落地 视觉套件

面向资源的架构(ROA)概述

码语者

SOA ROA

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