[转帖][搞点翻译]系统设计基础: 缓存(Caching)

翻译,系统,设计,基础,缓存,caching · 浏览次数 : 0

小编点评

**翻译整理:** 文章介绍了缓存的概念和作用,并讨论了缓存失效的三种应对措施。 **具体内容包括:** * 缓存是什么? * 缓存的作用是什么? * 缓存失效的三种应对措施是什么? * 缓存置换/消除有哪些? **补充说明:** * 缓存是一种存储在计算机系统中的数据副本,用于提高系统性能。 * 缓存可以存储最近使用的数据,避免从数据源获取数据。 * 缓存可以分为各种类型,如应用服务器缓存、数据库缓存、内容分发缓存等。 * 缓存可以失效,当数据源更新后,其对应的缓存就应该失效。

正文

https://zhuanlan.zhihu.com/p/569553681

 

最近在看一些系统设计相关的知识, 按我自己的理解做些翻译和整理, 和原文不一样, 有问题欢迎指出, 细节以原文为主:

这篇原文其实也没什么知识结构, 就是一些杂记.

其他一些资料参考自这个文章:

缓存(Caching)

缓存的思想是, 最近使用的数据很可能再次被使用. 缓存就像短期记忆, 虽然空间有限, 但通常比直接从数据源获取数据更快.

计算机的各个层面(硬件, 操作系统, 浏览器, 网页应用, 等等)都有用到缓存. 一般来说缓存都是在接近前端的位置使用, 就是储存常用的数据避免多次询问上游数据源.

应用服务器缓存(Application server cache)

如之前的负载均衡那边文章所说, 应用服务器(application server)是处于下图所在的位置:

 

 

用户请求的数据缓存可以存于内存里, 这样就可以快速访问, 或者也可以存于硬盘里, 至少比从数据上游(图例里是从数据库服务器)重新获取数据要快.

但有一个问题就是, 在有多个节点(服务器)的情况下, 某个用户数据的缓存可能存在任意一个服务器节点, 但之后的用户请求又被随机发送到另一个服务器节点, 之前的缓存就浪费了.

所以之前文章说的负载均衡算法之一IP哈希(IP Hash)在这种情况挺有用的, 某个用户的请求只会被发送到特定服务器节点, 对应的数据缓存就可以再次被用到了.

另外还有两种方法:

  1. 全局缓存(global caches): 不处于特定服务器节点而是全局层面的缓存
  2. 分布式缓存(distributed caches): 文章没多说了, 具体参考 

内容分发网络 (Content Delivery/Distribution Network, CDN)

内容分发网络(CDN)主要用于分发静态媒体数据(音乐, 图片, 视频, 应用程序). 同理CDN也就是一个缓存, 用户请求的时候, 如果本地有就直接从本地获取数据, 否则它会向后端获取数据再缓存.

如果我们建立的系统还不够大, 不需要CDN, 我们可以把静态媒体放于一个子域名下(比如), 然后用一个轻量级HTTP服务器比如Nginx, 之后再把这个子域名DNS转成CDN就好.

缓存失效(Cache Invalidation)

当数据源更新后, 它对应的缓存就应该失效. 而主要的应对措施有三种:

Write-through cache

这种方式下, 数据同时被写入缓存和数据库. 这样可以快速读取缓存数据, 并且因为同样的数据也被永久储存(写入数据库), 缓存和永久储存的数据就有一致性.

同时这种方式保证服务器崩溃, 停电, 或者其他事故发生时数据不会丢失(比如暂时存于缓存的话, 缓存服务器崩了数据就丢失了)

Write-around cache

write-through cache类似, 但是数据先直接写进永久储存(数据库), 不写进缓存. 这可以避免大量数据涌入缓存但最后又不会被用到.

但这个问题是, 最近写入的数据不会被保存到缓存, 之后又马上要被用的时候就会出现"缓存丢失(cache miss)", 需要重新从后端读数据, 这样延迟会比较高.

Write-back cache

这种方式是先写进缓存, 写完后立刻通知客户. 在之后特定时段或者特定条件下, 数据才会被写入永久储存(数据库).

这样的好处是低延迟, 高吞吐, 对于需要大量写入的应用比较友好.

但是这样的风险是在服务器崩溃或者其他事故时数据可能会丢失(没来得及永久储存).

Cache Aside

这种方式是任何情况都直接写进永久储存(数据库), 如果缓存有数据, 就直接删除缓存的数据. 当某数据再次被请求的时候, 重新从数据库读取数据存到缓存. 这种方式适用于读多写少的情况, 比如用户信息、新闻报道等,一旦写入缓存,几乎不会进行修改。该模式的缺点是可能会出现缓存和数据库双写不一致的情况。

缓存置换/消除 (Cache eviction policies)

因为缓存的空间有限, 当缓存满了的时候总是会需要删除一些数据. 下面是一些删除方式:

  1. 先进先出 First In First Out (FIFO)
  2. 后进先出 Last In First Out (LIFO)
  3. 删除最不常用 Least Recently Used (LRU)
  4. 删除最不频繁使用 Least Frequently Used (LFU)
  5. 随机替换 Random Replacement (RR)

其他资料

  1. Cache: )
  2. Introduction to architecting systems: 

与[转帖][搞点翻译]系统设计基础: 缓存(Caching)相似的内容:

[转帖][搞点翻译]系统设计基础: 缓存(Caching)

https://zhuanlan.zhihu.com/p/569553681 最近在看一些系统设计相关的知识, 按我自己的理解做些翻译和整理, 和原文不一样, 有问题欢迎指出, 细节以原文为主: https://www.educative.io/courses/grokking-the-system

[转帖][搞点翻译] 系统设计基础: 一致性哈希(Consistent Hashing)

https://zhuanlan.zhihu.com/p/568107004 背景 设计一个可扩展系统(scalable system)的时候, 最重要的一点是要考虑到在多个服务器之间如何拆分(partition)数据, 还有如何复制(replicate)数据. 我们来看看这两点的具体定义: 数据拆

[转帖]从零开始搞基建(5)——代码质量

https://www.cnblogs.com/strick/p/17336589.html 一、AppWorks AppWorks 是一款基于 VS Code 插件的前端研发工具集。 1)AppWorks Doctor 我试用了其中的代码质量检测插件,这款插件会依赖 package.json 文件

[转帖]C++:perf详解 + Flame Graph火焰图分析程序性能

因为项目需求,C++和java同时在搞,最近了解到Flame Graph火焰图这个工具,网上查了查资料,这里记录一下。 1 介绍 web site http://www.brendangregg.com/flamegraphs.html git: https://github.com/brendan

[转帖]关于SQLSERVER的max degree of parallelism参数

http://www.gaodaima.com/228823.html max degree of parallelism说明:本文来源gao($daima.com搞@代@#码8网^http://msdn.microsoft.com/zh-cn/library/ms181007.aspx 当 SQL

[转帖]把VIM打造成一个真正的IDE(1)

http://www.vimer.cn/2009/10/15/ba-vimda-zao-cheng-yi-ge-zhen-zheng-de-ide-1/ 这里所说的IDE主要是指C/C++开发,但是由于笔者之前也搞java和c#开发,所以对这两种语言也会有所兼顾。 这个话题可能要分好几篇文章来写了,

[转帖]用了这18种方案,接口性能提高了100倍!

https://juejin.cn/post/7167153109158854687 前言 大家好,我是捡田螺的小男孩。 之前工作中,遇到一个504超时问题。原因是因为接口耗时过长,超过nginx配置的10秒。然后 真枪实弹搞了一次接口性能优化,最后接口从11.3s降为170ms。本文将跟小伙伴们分

[转帖]java性能分析之火焰图

http://t.zoukankan.com/lemon-le-p-13820204.html 原由 最近因为kafka、zookeeper、ES和相关的Java应用的内存问题搞的头大,做运维将近4年,对Java调优、性能方面的知识了解的少之又少,是时候下定决心来对他多一个学习了。不能一口吃成一个胖

[转帖]性能优化 YYDS - Brendan Gregg 与 Intel.com 的故事

https://www.modb.pro/db/421309 译者序 金庸笔下的《鹿鼎记》有: !! 平生不识陈近南,便称英雄也枉然 现代的认真搞技术的后端程序员,应该也有一句: !! 平生不识 Brendan Gregg,便呆 BAT 也 SoSo 从 2016 年开始,做一个 JVM 调优开始,

[转帖]必看!PostgreSQL参数优化

https://www.modb.pro/db/48129 前不久,一个朋友所在的公司,业务人员整天都喊慢。 朋友是搞开发的,不是很懂DB,他说他们应用的其实没什么问题,但是就是每天一到高峰期就办理特别的慢啊,各种堵塞,一堆请求无法完成。他们没有专门的DBA,想找我帮忙看看。 我下班后打开他们的数据