概述

缓存基础

缓存是通过将计算结果或者数据临时存在可以快速访问的位置,从而提高系统吞吐和相应速度,本质是空间换时间

缓存在计算机系统中应用十分广泛,一些常见的缓存:

  • 客户端缓存:WEB页面缓存/APP本地缓存等
  • DNS缓存:缓存域名和对应IP地址,加速域名解析
  • CDN缓存:资源就近读取,加速静态/动态资源读取
  • 服务端缓存:缓存服务端计算结果,加速服务端响应
  • 数据库缓存:数据库本身也有查询缓存

缓存在高并发业务中可以提高访问速度,降低CPU负载和提供系统稳定性,但同时也会引入缓存一致性、缓存穿透、缓存雪崩、缓存击穿等问题。所以在做缓存方案设计时,要针对对应的业务场景设计合理的缓存架构、选择合适的缓存组件

缓存设计

多级缓存

在高并发场景中,通常会结合使用本地缓存和远程缓存,设计多级缓存机制,将业务流量逐级拦截,提升系统性能。

multi-level-cache

信息本地缓存远程缓存多级缓存
优势读写速度快,实现简单,单示例内共享缓存多实例共享缓存,相对容量大,支持数据持久化速度和容量之间的平衡
劣势容量小,多实例一致性难以保证,重启丢失数据远程调度开销,实现和管理相对复杂维护数据一致性复杂度较高
适用场景单实例应用或小型系统多实例分布式系统,对数据一致性、高可用性、缓存容量有要求的场景较为复杂的分布式场景,业务流量大对稳定性要求高

缓存命中率

命中率是衡量缓存效率的重要指标,表示缓存请求中多少比例是从缓存中成功获取的。

影响命中率的常见因素:

  • 缓存容量:缓存容量有限,缓存命中率会受到限制
  • 缓存淘汰策略:不同业务场景不同数据访问模式,选择合适的策略很重要
  • 缓存过期时间:缓存过期时间设置不当,可能会导致缓存命中率下降

Redis中查询缓存命中率的命令:INFO。其中keyspace_hits 表示成功从缓存中获取数据的次数, keyspace_misses 表示缓存未命中的次数。

淘汰策略

根据业务场景和数据访问模式,选择合适的淘汰策略可有效提高缓存命中率。

常见缓存策略:

策略描述适用场景
LRU(Least Recently Used)最近最少使用策略,缓存容量有限,需要淘汰最近最少使用的数据
LFU最不经常使用策略,淘汰最不经常使用的数据缓存容量有限,需要淘汰最不经常使用的数据
FIFO先进先出策略,淘汰最早进入缓存的数据缓存容量有限,需要淘汰最早进入缓存的数据

缓存模式

常见问题

数据一致性

大key问题

热点key问题

缓存穿透

缓存雪崩