我们经常会把缓存放在内存中来存储, 所以有人就把内存和缓存画上了等号,这完全是外行人的见解。作为业内人士,你要知道在某些场景下我们可能还会使用 SSD 作为冷数据的缓存。比如说 360 开源的 Pika 就是使用 SSD 存储数据解决 Redis 的容量瓶颈的。
但实际上,Pika后来发展也比较有限,代码也很久没有更新维护了。后面还出了诸多类似的产品如Tendis
缓存案例
Linux 内存管理是通过一个叫做 MMU(Memory Management Unit)的硬件,来实现从虚拟地址到物理地址的转换的,但是如果每次转换都要做这么复杂计算的话,无疑会造成性能的损耗,所以我们会借助一个叫做 TLB(Translation Lookaside Buffer)的组件来缓存最近转换过的虚拟地址,和物理地址的映射。TLB 就是一种缓存组件,缓存复杂运算的结果
缓存与缓冲区
缓存可以提高低速设备的访问速度,或者减少复杂耗时的计算带来的性能问题。理论上说,我们可以通过缓存解决所有关于“慢”的问题,比如从磁盘随机读取数据慢,从数据库查询数据慢,只是不同的场景消耗的存储成本不同。
缓冲区则是一块临时存储数据的区域,这些数据后面会被传输到其他设备上。缓冲区更像“消息队列篇”中即将提到的消息队列,用以弥补高速设备和低速设备通信时的速度差。比如,我们将数据写入磁盘时并不是直接刷盘,而是写到一块缓冲区里面,内核会标识这个缓冲区为脏。当经过一定时间或者脏缓冲区比例到达一定阈值时,由单独的线程把脏块刷新到硬盘上。这样避免了每次写数据都要刷盘带来的性能问题。
缓存分类
在我们日常开发中,常见的缓存主要就是静态缓存、分布式缓存和热点本地缓存这三种。
静态缓存也即静态文件缓存,如使用Nginx进行缓存
分布式缓存就是我们常用的Redis,Memcached等
热点本地缓存,也就是本地缓存,存在于程序中,常用的ehcache,guava cache,以及现在比较流行的caffeine
缓存的不足
- 首先,缓存比较适合于读多写少的业务场景,并且数据最好带有一定的热点属性。
- 其次,缓存会给整体系统带来复杂度,并且会有数据不一致的风险。
- 再次,之前提到缓存通常使用内存作为存储介质,但是内存并不是无限的。
- 最后,缓存会给运维也带来一定的成本
引用
本文为学习笔记,选自极客时间《高并发系统设计40问》