为什么说缓存是提高性能最好的方式?缓存有哪些设计模式?缓存设计的重点有哪些?

打卡Day29:今天学习了《58|性能设计篇之“缓存”》,我的收获如下:

分布式系统中最耗性能的地方就是数据库。select是出现性能问题最大的地方,应用的读多写少加剧了慢查询的问题,远程调用也会因为网络开销导致整体性能下降。

使用缓存是提高性能最好的方式。

缓存模式

Cache Aside

(失效:先从Cache取,如果没有得到,则从数据库中取,成功后,放到缓存中。命中:从Cache中取,取到后返回。更新:先把数据存到数据库中,成功后让缓存失效)

Read/Write Through

更新数据库的操作由缓存自己代理,应用认为后端是一个单一存储,存储自己维护Cache。

Write Behind Caching

又称Write Back,类似Linux的page cache算法。

在更新数据时只更新缓存,不更新数据看,缓存异步批量更新数据库。

问题:数据不是强一致性,可能会丢失;实现逻辑比较复杂。

设计取舍

在软件设计上,我们基本上不可能做出一个没有缺陷的设计,就像算法设计中的时间换空间、空间换时间一个道理。

有时候,强一致性和高性能,高可用和高性能是有冲突的。

软件设计从来都是trade-off(取舍)。

缓存设计的重点

  • 需要保证内存足够大,网络带宽也要好,因为缓存本质上是个内存和IO密集型的应用。
  • 用数据分片技术把不同的缓存分布到不同机器上,让缓存集群可以不断scale下去。
  • 缓存好坏要看命中率,达到80%以上就算很高了。
  • 牺牲强一致性来提高性能,不是所有业务都适合用缓存。
  • 缓存数据的时间周期太长太短都不好,太短加重数据库负担,太长浪费内存。
  • 一般使用LRU策略,即优先清出最长时间没有被访问过的数据,维护LRU中被访问数据的顺序排位会带来额外的锁开销。
  • 当心爬虫挤出热点数据,可以引导去使用外部API,把用户和开发者的缓存系统分离)。

左耳朵耗子带你重学《左耳听风》

https://time.geekbang.org/column/article/6282