思维导图:
1. 缓存的基本概念
1.1 缓存的实例化解释
以火车站刷身份证为例,身份证存放在皮箱中虽安全,但取用不便;而将其置于衣袋,则显著提高了访问效率。这一过程恰似计算机系统中缓存的运作机制——将常用数据暂存于高速存储器中,以减少对低速存储设备的频繁访问。
在计算机网络设备中,这一原则同样适用:高速存储器常被用作低速存储器的缓存。典型的访问速度层级如下:
- CPU 寄存器:最快的存储设备,直接与 CPU 交互,延迟极低。
- 内存:作为 CPU 与硬盘之间的缓冲区,访问速度远高于硬盘。
- 硬盘:机械硬盘的 I/O 速度较慢,尤其是随机访问操作。
- 网络存储:通过网络访问的存储设备,受限于网络带宽和延迟。
例如,内存常被用作硬盘的缓存,以加速数据读取速度。
硬盘也可以作为网络的缓存,拿浏览器举例。
浏览器通过 http/https 从服务器上获取数据(html,css,js,图片,视频,音频,字体.....)并进行展示,像图片,视频这样体积大,不容易改变的数据,就可以保存到本地的硬盘,下次再需要访问的时候,就可以直接从本地获取,不需要通过网络获取。
1.2 缓存的有效性分析
尽管缓存存储容量有限,其有效性却不容小觑。这一现象可归因于“二八原则”(帕累托法则),即约 20% 的数据通常承载了 80% 的访问请求。通过精准识别并缓存这些高频数据,系统能够显著提升整体性能与响应速度。
补充案例
根据国际标准对浏览器缓存的研究显示,合理利用硬盘缓存可将网页加载速度提升约 30%-50%。某电商平台通过分析用户行为数据发现,约 25% 的商品页面访问量占据了总流量的 82%。通过将这些热门商品页面缓存至内存中,该平台成功将页面加载时间缩短了 40%。
2. Redis 如何作为缓存使用
2.1 Redis 缓存的优势
Redis 是一种高性能的内存数据库,常被用作关系型数据库(如 MySQL)的缓存层,以缓解数据库的性能瓶颈。MySQL 等关系型数据库在处理高并发请求时,常面临以下性能挑战:
- 存储介质限制:数据存储于硬盘,其 I/O 速度远低于内存,尤其是随机访问操作更为耗时。
- 索引失效:若查询未能命中索引,则需遍历整个表,导致硬盘 I/O 操作显著增加。
- SQL 处理开销:数据库需对 SQL 查询进行解析、校验及优化,这一过程增加了额外的计算负担。
- 复杂查询压力:联合查询等复杂操作往往返回大量数据,进一步加剧了数据库的负载。
通过引入 Redis 缓存,系统能够显著提升数据读取速度并降低数据库负载。例如,Redis 常被用作 MySQL 数据库的缓存层,其内存存储特性使得数据访问速度远高于硬盘存储。
补充数据
根据行业白皮书统计,未使用缓存的 MySQL 数据库在高并发场景下的响应时间平均为 500ms,而引入 Redis 缓存后,响应时间可降至 100ms 以内。
3. Redis 的更新策略
3.1 定期生成策略
定期生成策略通过定时任务自动更新缓存数据,适用于访问模式较为稳定的场景。
- 日志记录:系统将访问数据以日志形式保存,便于后续分析。
- 离线处理:通过 Python 或 Shell 脚本编写离线处理流程,自动化执行数据统计与缓存更新任务。
- 定时触发:利用定时任务调度工具(如 Cron),定期执行上述脚本,确保缓存数据的时效性。
- 数据同步与重启:将统计得到的热点数据同步至缓存服务器,并在必要时重启服务以应用最新配置。
优点
- 实现简单、易于维护,并便于问题排查。
缺点
- 实时性较差,例如当某些关键词因突发事件迅速成为热词时,定时生成机制无法及时更新缓存,可能导致数据库承受突发的高频访问压力。
补充案例
某社交媒体平台采用定期生成策略,每日凌晨 2 点自动统计过去 24 小时的热门话题,并将其缓存至 Redis 中。这一策略有效提升了平台的响应速度,同时降低了数据库的负载压力。
3.2 实时生成策略
实时生成策略通过动态监控访问数据并及时更新缓存,适用于访问模式变化频繁的场景。
- 请求拦截:当客户端发起数据请求时,系统首先查询 Redis 缓存。
- 缓存命中:若缓存中存在目标数据,则直接返回结果。
- 缓存未命中:若缓存中不存在目标数据,则从数据库中读取数据,并将其写入 Redis 缓存以备后续使用。
内存淘汰策略
为应对内存容量限制,系统需采用内存淘汰策略以管理缓存数据。常见的内存淘汰算法包括以下几种:
- FIFO(先进先出):优先淘汰最早进入缓存的数据项。
- LRU(最近最少使用):基于数据项的访问时间进行淘汰,优先移除最久未被访问的数据项。
- LFU(最少使用频率):根据数据项的访问次数进行淘汰,优先移除访问频率最低的数据项。
- Random(随机淘汰):随机选择数据项进行淘汰。
补充数据
根据统计局发布的缓存性能分析报告,LRU 算法在大多数场景下的缓存命中率可达 85% 以上,显著优于 FIFO 和 Random 策略。
4. Redis 的注意事项
4.1 缓存穿透
缓存穿透是指查询请求在 Redis 和 MySQL 中均未命中目标数据,导致每次请求均需直接访问数据库。这种情况可能由以下原因引发:
- 业务设计缺陷:缺乏必要的参数校验机制,导致非法或无效的查询请求频繁发生。
- 系统故障:开发或运维过程中误删数据库中的关键数据,导致缓存与数据库均无法提供有效响应。
- 恶意攻击:黑客利用自动化工具发起大量无效查询请求,试图耗尽数据库资源。
解决方案
- 空值缓存:当 Redis 和 MySQL 均未命中目标数据时,将空结果(如特殊标记)缓存至 Redis 中,并设置较短的过期时间。
- 布隆过滤器:引入布隆过滤器作为前置校验机制,快速判断某个 key 是否存在,从而避免无效查询请求到达数据库层。
4.2 缓存雪崩与击穿
缓存雪崩是指在短时间内大量缓存数据同时失效,导致缓存命中率急剧下降,并使数据库承受巨大压力。缓存击穿则是缓存雪崩的一种特殊形式,通常由热点数据的缓存过期引发。
解决方案
- 增强监控与报警:部署全面的 Redis 监控系统,实时监测服务器状态、内存使用情况及缓存命中率,并设置预警机制以便及时响应异常情况。
- 优化过期策略:避免为大量缓存数据设置相同的过期时间,可通过引入随机因子分散过期时间,降低缓存失效的集中性。
- 热点数据永不过期:通过分析访问模式识别热点数据,并为其设置永不过期策略,确保高频访问数据始终可用。
- 服务降级与限流:在系统负载过高时,暂时关闭非核心功能,集中资源保障核心功能的正常运行。同时,通过限流机制控制数据库的访问频率,防止突发流量导致系统崩溃。
补充案例
某电商平台在双 11 大促期间,通过热点数据永不过期和服务降级策略,成功应对了高达 10 倍于日常流量的访问请求,确保了系统的稳定性和用户体验