5.1 缓存简介
缓存一词,在计算机中,最早主要用于计算机硬件的设计中,比如 CPU Cache。缓存的原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。对 CPU 缓存(Cache)而言,它里面的内容只是内存中少部分数据的复制品,但速度更快。
优秀的东西总是会被借鉴。在计算机软件系统中,就借用了缓存这个思想来提高系统性能。有一句名言:
商业世界里,现金为王;架构世界里,缓存为王。
可见缓存在系统设计中的重要性。本章讨论的缓存,专指软件系统中使用的缓存技术。
对于 Web 系统而言,缓存无处不在:
- 大流量、高并发时,数据库常常会成为瓶颈,这时一般会引入分布式缓存,缓解数据库的压力。常见的有 Redis、Memcached。可以说没有缓存,数据库是根本支持不了那么大的流量的。(其实,数据库内部也会有缓存,比如查询缓存。甚至有 MySQL 的 Memcached 插件)
- 由于分布式缓存会有网络开销,所以出现了进程内缓存(也叫本地缓存),指的是应用中的缓存组件。这种缓存的优点是应用和缓存在同一进程内,进程内缓存省去了网络开销,因此节省了内网带宽,同时响应时延会更低。缺点就是多个应用无法共享缓存,且难以保持进程缓存的一致性。
- 动态语言甚至会有语言级的缓存,比如:PHP 的 opcode 缓存,这是语言级的优化。
- CDN 缓存、HTTP 缓存、Web 浏览器缓存等。
这里我们不展开讨论各种缓存的用途、优缺点,主要关注进程内缓存的应用场景。
5.1.1 进程内缓存的应用场景
上面简单介绍了这种缓存的优缺点,那进程内缓存有哪些应用场景?
1、只读数据,可以考虑在进程启动时加载到内存
比如配置信息,可以在启动时加载进内存。
2、高并发,如果透传到后端压力极大的场景,可以考虑使用进程内缓存
比如秒杀,并发量极高,可以考虑使用进程内缓存。
3、一定程度上允许分布式不同节点数据不一致
例如,一些计数场景,运营场景,页面对数据一致性要求较低,可以考虑使用进程内页面缓存。
4、对性能要求极高,进程外缓存的网络开销无法满足需求
如果你有这样的场景,进程内缓存适合你。Go 语言的 BigCache 缓存库出现的背景之一就是因为这点。
注意,进程内缓存和进程外缓存的使用并不冲突,可以同时存在。
本图书由 煎鱼©2020 版权所有,所有文章采用知识署名-非商业性使用-禁止演绎 4.0 国际进行许可。