缓存定义与意义
- 狭义缓存:加速CPU数据交换的存储器。
- 广义缓存:所有用于数据高速交换的存储介质,包括硬件和软件。
- 缓存目的:通过数据交换缓冲区减少原始数据获取代价,提高读写性能。
缓存思想与性能
- 时间局限性原理:数据一旦被获取,未来可能被多次引用。
- 以空间换时间:使用高速独立空间来提供数据的高效访问。
- 性能成本权衡:访问延迟越低,性能越高,成本也越大。
缓存的优势与代价
- 优势 :
- 提升访问性能。
- 降低网络拥堵。
- 减轻服务负载。
- 增强可扩展性。
- 代价 :
- 增加系统复杂度。
- 增加部署和运行成本。
- 存在数据一致性问题。
缓存读写模式
- Cache Aside(旁路缓存) :
- 写操作:更新数据库后删除缓存中的key。
- 读操作:先读缓存,未命中则读数据库并回写缓存。
- Read/Write Through(读写穿透) :
- 业务应用通过存储服务与缓存和数据库交互。
- 存储服务代理处理缓存和数据库的读写操作。
- Write Behind Caching(异步缓存写入) :
- 先更新缓存,异步批量更新数据库。
- 写性能高,但可能数据一致性差,存在数据丢失风险。
缓存问题解决方案
- 缓存穿透 :
- 频繁查询不存在的数据。
- 解决方案:接口校验、缓存空对象、布隆过滤器。
- 缓存击穿 :
- 热点Key过期导致大量请求访问数据库。
- 解决方案:永不过期、逻辑过期、使用互斥锁。
- 缓存雪崩 :
- 大量缓存key同时失效或服务宕机。
- 解决方案:随机过期时间、集群部署、多级缓存、降级限流。
缓存数据不一致和并发竞争
- 数据不一致 :
- 原因:更新数据库后缓存更新失败。
- 解决方案:重试更新、使用队列服务、缓存分层策略。
- 数据并发竞争 :
- 原因:缓存miss导致大量请求并发查询数据库。
- 解决方案:全局锁、多个缓存备份。
Hot Key和Big Key问题
- Hot Key :
- 原因:突发热门事件导致大量请求。
- 解决方案:识别热key、分散缓存节点、多副本架构、监控SLA、本地缓存。
- Big Key :
- 原因:缓存Value过大导致读写超时。
- 解决方案:启用压缩、预先分配足够空间、序列化构建、分拆大key。
Redis网络模型
- 用户空间与内核空间 :
- 用户空间通过内核接口访问资源。
- 内核空间直接调用系统资源。
- Linux缓冲区 :
- 用户空间和内核空间都加入缓冲区提高IO效率。
- 网络模型 :
- 阻塞IO:两个阶段都阻塞。
- 非阻塞IO:第一阶段不阻塞,第二阶段阻塞。
- IO多路复用:单个线程监听多个FD。
- 信号驱动IO:通过信号通知用户进程FD就绪。
- 异步IO:内核完成数据处理后写入用户态。
Redis多线程支持
- Redis v4.0:引入多线程处理耗时任务。
- Redis v6.0:在核心网络模型中引入多线程。
缓存设计架构考量点
- 读写方式:整体读写或部分读写。
- KV size:根据业务数据大小分拆或合并KV。
- key数量:全量数据或只保留热数据。
- 读写峰值:独立Cache池或分层处理。
- 命中率:持续监控和故障处理。
- 过期策略:设置合理过期时间或使用时间戳。