redis 缓存穿透,缓存雪崩,缓存击穿

针对Redis缓存的雪崩、击穿、穿透问题分析及解决方法,您的描述大体上是正确的,但有一些细节可以修正和补充:

缓存穿透

问题分析

缓存穿透是指查询一个不存在的数据,由于缓存和数据库中都没有该数据,因此不会将其写入缓存,导致每次查询都会直接请求数据库,从而对数据库造成巨大压力。

解决方法
  1. 布隆过滤器
    • 使用布隆过滤器可以快速判断一个值是否存在于集合中。
    • 如果值存在,则可能返回缓存数据(注意布隆过滤器有一定的误判率,但误判不会导致数据错误,只是可能多查一次数据库)。
    • 如果值不存在,则直接返回空,不查询数据库。
  2. 缓存空对象
    • 当存储层不命中后,即使返回的空对象也将其缓存起来,并设置一个较短的过期时间。
    • 这样,在过期时间内,相同请求会直接返回缓存中的空对象,避免了对数据库的重复查询。

缓存雪崩

问题分析

缓存雪崩是指由于大量缓存失效或者缓存整体不能提供服务,导致大量的请求到达存储层(数据库),从而使存储层负载增加,可能导致系统崩溃。

解决方法
  1. 分布式锁
    • 在缓存更新或过期的情况下,先获取分布式锁,再进行更新或从数据库中获取数据后释放锁。
    • 确保只有少数请求可以修改缓存,降低并发冲突带来的影响。
  2. 消息中间件
    • 缓存更新可以推迟到后台任务完成,使用消息中间件(如Kafka、RabbitMQ等)处理缓存更新请求。
    • 这样即使有大量的更新请求,也不会立即冲击缓存服务,减少了雪崩的可能性。
  3. 多级缓存
    • 使用一级和二级缓存(如Redis+Ehcache),当一级缓存满或数据更新时,将部分数据迁移到二级缓存或持久化存储。
    • 保证短期高频访问的数据能够快速响应。
  4. 均匀分布缓存失效时间
    • 分析用户行为,尽量让缓存失效的时间均匀分布。
    • 为每个缓存项设置一个随机的过期时间,避免大量缓存同时失效。

缓存击穿

问题分析

缓存击穿是指一个被频繁访问(高并发访问且缓存重建业务较复杂)的缓存键因为过期失效,此时若有大量并发请求到来,这些请求发现缓存过期后一般都会从后端数据库加载数据并回设到缓存,这可能导致数据库瞬间被压垮。

解决方法
  1. 互斥锁
    • 在缓存失效时,使用互斥锁(如Redis的SETNX命令)确保只有一个线程能够访问数据库并更新缓存。
    • 其他线程在获取锁失败后会等待一段时间并重试,或者直接返回旧数据(如果业务允许)。
  2. 逻辑过期
    • 将缓存的key值设置为永不过期,并在缓存的value中添加一个逻辑过期时间。
    • 当获取缓存时,先检查逻辑过期时间是否已过。
    • 如果已过,则尝试获取互斥锁并异步更新缓存数据;如果未过,则直接返回缓存数据。

其他

  • 在使用互斥锁时,需要注意锁的粒度(尽量细粒度以减少锁竞争)和锁的超时时间(避免死锁)。
  • 逻辑过期方案虽然能够避免缓存击穿问题,但可能会返回脏数据(即过期但未被更新的数据)。因此,在业务允许的情况下,可以结合限流、降级等策略来进一步降低风险。
  • 针对布隆过滤器,虽然有一定的误判率,但可以通过增加哈希函数的数量和位数来降低误判率。同时,布隆过滤器不支持删除操作,因此在需要删除元素时需要考虑其他策略(如使用计数布隆过滤器等)。
相关推荐
痴儿哈哈39 分钟前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
Σίσυφος19001 小时前
PCL法向量估计 之 方向约束法向量(Orientation Guided Normal)
数据库
老毛肚1 小时前
手写mybatis
java·数据库·mybatis
海山数据库1 小时前
移动云大云海山数据库(He3DB)postgresql_anonymizer插件原理介绍与安装
数据库·he3db·大云海山数据库·移动云数据库
云飞云共享云桌面1 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
2501_927993531 小时前
SQL Server 2022安装详细教程(图文详解,非常详细)
数据库·sqlserver
星火s漫天2 小时前
第一篇: 使用Docker部署flask项目(Flask + DB 容器化)
数据库·docker·flask
xcLeigh2 小时前
Python 项目实战:用 Flask 实现 MySQL 数据库增删改查 API
数据库·python·mysql·flask·教程·python3
威迪斯特2 小时前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
xu_yule2 小时前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式