当前位置: 首页 > news >正文

Redis:内存淘汰原则,缓存击穿,缓存穿透,缓存雪崩

为什么用redis作为缓存?

高性能和低延迟:内存存储、单线程模型和高效的数据结构,使数据访问速度极快,延迟低。

丰富的数据类型:支持字符串、哈希、列表、集合等多种数据类型,操作灵活,适用于多样业务场景。

高可用性与持久化:支持 RDB、AOF 持久化方案,主从复制、哨兵机制和集群模式确保高可用性和数据安全。

减轻数据库压力:缓存热点数据,减少数据库访问频率,支持数据过期策略(LRU、LFU、TTL),合理利用内存资源。

广泛应用场景:用于会话缓存、排行榜、计数器、分布式锁、消息队列等。

成熟的生态系统:多语言支持,社区活跃,易于集成和维护。

内存淘汰策略

不淘汰策略

策略行为
noeviction默认内存满时,新写入操作返回错误(如 OOM),读操作正常。
allkeys-random所有键中随机删除一个,无论是否过期。

基于过期时间的策略

策略行为
volatile-random设置了过期时间的键中随机删除一个。
volatile-ttl优先删除**剩余存活时间最短(TTL最小)**的过期键。
volatile-lru设置了过期时间的键中删除**最近最少使用(LRU)**的键。
volatile-lfu(4.0+)设置了过期时间的键中删除**最不频繁使用(LFU)**的键。

全局键淘汰策略

策略行为
allkeys-lru所有键中删除**最近最少使用(LRU)**的键。
allkeys-lfu(4.0+)所有键中删除**最不频繁使用(LFU)**的键。

LRU(Least Recently Used)

  • 原理:优先淘汰最久未被访问的数据。
  • Redis 实现:近似 LRU,通过随机采样(默认5个键)选择最久未使用的键,平衡性能与精度。

LFU(Least Frequently Used)

  • 原理:优先淘汰访问频率最低的数据。
  • Redis 实现(4.0+):
    • 使用 Morris 计数器算法,统计访问频率。
    • 支持衰减机制(lfu-decay-time):随时间降低计数,避免历史热点数据长期占用内存。

缓存预热

是什么?

缓存预热是指在系统启动或重新上线时,提前将常用或热门数据加载到缓存中,避免系统启动初期因缓存未命中导致大量请求落到数据库,造成系统压力骤增。

如何产生?

  • 系统刚启动或重启时,缓存为空,大量请求直接访问数据库,造成数据库压力大、响应慢,甚至宕机。

  • 无预热策略的缓存系统,在流量高峰期无法承受瞬时冲击,影响用户体验。

如何解决?

  • 手动预热:通过脚本或后台任务提前加载数据(如商品详情、配置信息)。
  • 日志分析:结合业务特性,如将热点商品、用户常用信息等主动预热到缓存。
  • 动态预热:结合业务逻辑,在首次查询后异步填充缓存。

缓存穿透

是什么?

查询不存在的数据,导致请求绕过缓存直接访问数据库(如恶意请求不存在的 ID)。

如何产生?

  • 恶意攻击:频繁请求无效 Key(如 id=-1)。
  • 业务逻辑缺陷:未校验参数合法性。

如何解决?

  • 缓存空值:对不存在的 Key 缓存 NULL 或短 TTL 的空对象,避免重复查询数据库。
  • 布隆过滤器(Bloom Filter):在缓存前加一层过滤器,快速判断 Key 是否存在。
  • 参数校验:拦截非法请求(如非正整数 ID)。

缓存击穿

是什么?

某个热点 Key 突然过期,同时大量请求直接击穿到数据库,导致瞬时压力激增。

如何产生?

  • 热点 Key 过期时间设置不合理(如高峰期过期)。
  • 未对热点数据做特殊处理。

如何解决?

  • 永不过期策略:对极热点 Key 不设 TTL,通过逻辑过期(如后台异步更新)。
  • 互斥锁:在缓存失效时对访问同一 Key 的请求加锁,防止击穿。
  • 提前刷新缓存:在缓存过期前异步刷新或延长有效期,确保缓存命中率。

缓存雪崩

是什么?

大量缓存 Key 同时过期缓存服务宕机,导致所有请求直接访问数据库,引发连锁故障。

如何产生?

  • 缓存 Key 的 TTL 相同(如批量导入数据默认过期时间)。
  • Redis 集群宕机或网络分区。

如何解决?

  • 过期时间分散:将缓存的过期时间随机化,避免大量缓存同时失效。
  • 多级缓存:结合本地缓存(Caffeine)和分布式缓存(Redis),降低单点风险。
  • 降级限流:在缓存失效或数据库异常时,快速降级,限制流量,保证系统稳定。
  • 高可用架构:Redis Cluster + Sentinel 避免全盘崩溃。
问题核心原因解决方案
缓存预热冷启动缓存为空主动加载热点数据
缓存穿透查询不存在的数据布隆过滤器 + 缓存空值
缓存击穿热点Key突然过期互斥锁 + 永不过期
缓存雪崩大量Key同时过期差异化TTL + 多级缓存
服务宕机降级限流 + 高可用架构

相关文章:

  • 从零开始:如何打造一套完整的UI设计系统?
  • 数据可视化——让数据说话的魔法
  • java反射笔记、内省、动态代理
  • Redis 梳理汇总目录
  • torch.nn.Conv2d介绍——Pytorch中的二维卷积层
  • 非对称加密算法详解
  • Sourcetree安装教程及配合Gitee的使用
  • CD21.【C++ Dev】类和对象(12) 流插入运算符的重载
  • 埃文科技企业AI大模型一体机——昇腾体系+DeepSeek+RAG一站式解决方案
  • 附录:LInux编辑器学习笔记
  • 技术长期主义:用本分思维重构JavaScript逆向知识体系(一)Babel、AST、ES6+、ES5、浏览器环境、Node.js环境的关系和处理流程
  • Docker学习--本地镜像管理相关命令--docker build 命令
  • IP(Internet Protocol,互联网协议)
  • 解决 CANoe 多测试用例下固定 IP 地址冲突问题的分析与方案
  • 【无标题】Scala函数基础
  • Docker学习--本地镜像管理相关命令--docker images 命令
  • 新能源汽车空调系统(R134A)性能评估(一)
  • 控制大型语言模型(LLM)行为的八种技术
  • 学习笔记--(6)
  • 数据结构(4)——带哨兵位循环双向链表
  • 洗冤录|县令遇豪强:黄榦处理的一起地产纠纷案
  • 人民日报刊文:守护“技术进步须服务于人性温暖”的文明底线
  • 中非民间对话在赞比亚举行
  • 中国象棋协会坚决支持司法机关依法打击涉象棋行业的违法行为
  • 港理大研究揭示:塑胶废物潜藏微生物群落或引发生态危机
  • 城管给商户培训英语、政银企合作纾困,上海街镇这样优化营商环境