性能设计篇之“缓存”

98 阅读2分钟

更新模式

  1. Cache Aside 更新模式
    • 失效: 应用程序先从 Cache 取数据,如果没有得到,则从数据库中取数据,成功后,放到缓存中。
    • 命中: 应用程序从 Cache 中取数据,取到后返回。
    • 更新: 先把数据存到数据库中,成功后,再让缓存失效。 image.pngimage.png 问题:需要维护两个数据存储,一个是缓存(cache),一个是数据库(repository),应用程序需要分别处理
  2. Read/Write Through 更新模式
    • Read Through: 查询操作中更新缓存,缓存时效时,Cache Aside是由调用方把数据放入缓存,而 Read Through是由缓存服务自己来加载,对应用方式透明的
    • Write Through: 在更新数据时发生。当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后由 Cache 自己更新数据库(这是一个同步操作)。 image.png
  3. Wride Behind Caching 更新模式
    • Write Behind 又叫 Write Back,与Linux 文件系统的 page cache 算法一致;
    • 定义: 在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。这个设计的好处就是让数据的 I/O 操作飞快无比(因为直接操作内存嘛)。因为异步,Write Back 还可以合并对同- 一个数据的多次操作,所以性能的提高是相当可观的。
    • 问题:数据不是强一致性的,而且可能会丢失(我们知道 Unix/Linux 非正常关机会导致数据丢失,就是因为这个事),在软件设计上,我们基本上不可能做出一个没有缺陷的设计,就像算法设计中的时间换空间、空间换时间一个道理。有时候,强一致性和高性能,高可用和高性能是有冲突的。软件设计从来都是 trade-off(取舍)。 image.png