概述
缓存基础
缓存是通过将计算结果或者数据临时存在可以快速访问的位置,从而提高系统吞吐和相应速度,本质是空间换时间。
缓存在计算机系统中应用十分广泛,一些常见的缓存:
- 客户端缓存:WEB页面缓存/APP本地缓存等
- DNS缓存:缓存域名和对应IP地址,加速域名解析
- CDN缓存:资源就近读取,加速静态/动态资源读取
- 服务端缓存:缓存服务端计算结果,加速服务端响应
- 数据库缓存:数据库本身也有查询缓存
缓存在高并发业务中可以提高访问速度,降低CPU负载和提供系统稳定性,但同时也会引入缓存一致性、缓存穿透、缓存雪崩、缓存击穿等问题。所以在做缓存方案设计时,要针对对应的业务场景设计合理的缓存架构、选择合适的缓存组件。
缓存设计
多级缓存
在高并发场景中,通常会结合使用本地缓存和远程缓存,设计多级缓存机制,将业务流量逐级拦截,提升系统性能。
信息 | 本地缓存 | 远程缓存 | 多级缓存 |
---|---|---|---|
优势 | 读写速度快,实现简单,单示例内共享缓存 | 多实例共享缓存,相对容量大,支持数据持久化 | 速度和容量之间的平衡 |
劣势 | 容量小,多实例一致性难以保证,重启丢失数据 | 远程调度开销,实现和管理相对复杂 | 维护数据一致性复杂度较高 |
适用场景 | 单实例应用或小型系统 | 多实例分布式系统,对数据一致性、高可用性、缓存容量有要求的场景 | 较为复杂的分布式场景,业务流量大对稳定性要求高 |
缓存命中率
命中率是衡量缓存效率的重要指标,表示缓存请求中多少比例是从缓存中成功获取的。
影响命中率的常见因素:
- 缓存容量:缓存容量有限,缓存命中率会受到限制
- 缓存淘汰策略:不同业务场景不同数据访问模式,选择合适的策略很重要
- 缓存过期时间:缓存过期时间设置不当,可能会导致缓存命中率下降
Redis中查询缓存命中率的命令:
INFO
。其中keyspace_hits
表示成功从缓存中获取数据的次数,keyspace_misses
表示缓存未命中的次数。
淘汰策略
根据业务场景和数据访问模式,选择合适的淘汰策略可有效提高缓存命中率。
常见缓存策略:
策略 | 描述 | 适用场景 |
---|---|---|
LRU(Least Recently Used) | 最近最少使用策略, | 缓存容量有限,需要淘汰最近最少使用的数据 |
LFU | 最不经常使用策略,淘汰最不经常使用的数据 | 缓存容量有限,需要淘汰最不经常使用的数据 |
FIFO | 先进先出策略,淘汰最早进入缓存的数据 | 缓存容量有限,需要淘汰最早进入缓存的数据 |