转载自大型系统中缓存的使用
一、前言
在处理高并发请求时,缓存几乎是无往不利的利器。举个例子,在下图中有两个请求:请求1命中缓存,总耗时= 网络耗时t1 + 缓存数据获取t2,请求2总耗时 = 网络耗时 t1 + 缓存数据获取t3。t3-t2就是缓存带来的性能提升。实际业务场景中,查询一次DB需要耗时20ms,读取一次缓存耗时1ms,那么就节省了19ms。
Java性能优化指南—缓存那些事
从实际的场景出发,可以将缓存的使用分为两大类:
- 使用更快的存储介质替代慢的,减少数据访问时间,比如内存替代磁盘
- 缓存计算结果,节省计算资源,比如缓存DB查询结果
- 就近访问,常见的如CDN。将数据存储到多个CDN中,选择距离最近的CDN访问数据
对于第一类使用方式,可能不是特别直观,我们看下数据
从上图可以看到,最快的一级缓存到最慢的网络读写之间差了3亿倍。
第二类比较好理解,从开篇举的例子就能看出,计算消耗的资源越多,缓存的效果就越明显。
通常这两类使用方式结合,能达到优化响应,节省计算资源,降低后端负载的目的。但是有利就有弊,相对于他的巨大好处,带来的弊端也是巨大的,甚至某些场景并不适合缓存。
- 数据不一致性。无论多么好的设计,缓存数据与真实数据源一定存在着一定时间窗口,这段时间内数据是不一致的
- 代码维护成本。有缓存后,代码就会在原数据源基础上加入缓存的相关代码,例如某数据存储在DB中,通过sql进行查询,现在需要同步设计一套缓存的存储、同步、使用的代码。必然增加代码工作量和系统架构的复杂度
在大型分布式系统中,缓存是不可或缺的,那么使用它要注意些什么呢?
请看大型系统中缓存的使用。