高并发系统设计(三)缓存 未完
广义上讲,凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为缓存
是一种常见的空间换时间的性能优化手段

常见案例
- Linux MMU 使用LTB来缓存最近虚拟地址和物理地址的映射。
- 刷视频预缓存下一个视频
- HTTP协议 ETag
缓存与缓冲区
缓存区是用于弥补高速设备和低速设备通信时的速度差。一块临时存储数据的区域,这些数据后面会一次性传输到其他设备上
缓存分类
- 静态缓存
HTML,对动态请求的数据无力。 - 分布式缓存
Redis、Memcached - 热点本地缓存
极端的热点数据查询。 HashMap,Guava Cache
缓存的不足
系统复杂度、数据不一致、运维、内存有限,比较适合读多写少,数据带有一点热点属性的业务场景
缓存的读写策略
-
Cache Aside 旁路缓存策略
![]()
- 读策略
- 从缓存中读取数据
- 命中,直接返回
- 不命中,从数据库中查
- 查后,数据写入缓存,并返回给用户
- 写策略
- 更新数据库中的记录
- 删除缓存
最常用,但当写入比较频繁时,缓存中的数据会被频繁地清理。
- 读策略
-
Read/Write Through 读穿/写穿策略
![]()
由缓存节点而非用户来和数据库打交道,并且写数据库是同步的,对性能来说比较大影响
- Write Back 写回策略
在写入数据时只写入缓存,并把缓存块标记为“脏”,脏块只有被再次使用时才会将其中的数据写回后端存储中
![]()
分布式缓存高可用方案
-
客户端方案
-
缓存数据如何分片
-
Hash分片算法
![]()
-
一致性Hash分片算法
![]()
-
-
Memcached的主从机制
![]()
-
多副本
![]()
-
-
中间代理层方案
![]()
-
服务端方案
![]()
缓存穿透
缓存中没有查到数据,不得不从后端系统中查询的情况。










浙公网安备 33010602011771号