为什么说缓存是提高性能最好的方式?缓存有哪些设计模式?缓存设计的重点有哪些?
打卡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,把用户和开发者的缓存系统分离)。