Redis拷打第一讲

题1:讲讲缓存穿透以及解决方案

概念

缓存穿透是指查询一个一定不存在的Key,导致缓存未命中,每次请求都打到数据库,可能压垮数据库。

解决方案

  1. 缓存空值
    • 第一次查询数据库发现不存在时,在缓存中存空值,并设置过期时间
    • 防止重复查询,减轻数据库压力
  2. 布隆过滤器
    • 插入Key前先通过布隆过滤器判断Key是否可能存在
    • 不存在则直接返回,不访问数据库

题2:讲讲布隆过滤器是什么,解决了什么问题

解决问题

  • 防止缓存穿透,拦截不存在Key的请求

底层原理

  1. 初始化一个大的二进制数组(全0)
  2. 插入Key时,经过多次哈希(例如3次),每次对数组长度取余 → 得到数组下标
  3. 将三个下标对应位置置1
  4. 查询Key时,同样哈希,检查三个位置:
    • 都为1 → Key可能存在
    • 任意为0 → Key一定不存在

误判原因

  • 不同key哈希到数组同一位置,导致未存key被误判为存在

误判率控制

  • 调整数组长度和哈希函数数量
  • 一般设置 ≤5%,可满足大多数项目需求

题3:讲讲缓存击穿是什么,与穿透的区别以及解决方案

概念

  • Key存在,但刚好过期时,高并发访问同一Key,缓存未命中,大量请求打数据库,可能压垮数据库

区别于缓存穿透

穿透 :查询一个一定不存在的Key

击穿 :查询存在的Key,但恰好过期

解决方案

  1. 互斥锁 / 分布式锁
    • 第一个访问过期Key的线程加锁访问数据库并刷新缓存
    • 其他线程等待或重试,保证数据库压力不被瞬时放大
    • 适用于强一致得场景
  2. 逻辑过期
    • 缓存存入时不设置过期时间
    • 查询时判断是否过期
      • 过期 → 异步线程刷新缓存
      • 当前线程直接返回旧值
    • 适用于高并发场景,但可能返回旧值

题4:讲讲缓存雪崩是什么以及解决方案

概念

  • 大量Key在同一时间过期,高并发请求同时到来,缓存未命中,大量请求直接打到数据库,可能压垮数据库

解决方案

  1. TTL随机化
    • 在原有过期时间上随机加几分钟,避免大批Key同时过期
  2. 缓存预热
    • 定时将热点Key提前加载到缓存
    • 避免冷启动阶段请求打数据库
  3. 多级缓存
    • 本地缓存 + Redis分布式缓存 + 数据库
    • 即使Redis部分失效,本地缓存仍可拦截部分请求,降低瞬时压力

相关推荐
zfoo-framework7 小时前
redis基于指定6.0.9 tag新建学习分支
redis
程序员小八7777 小时前
MySQL 事务:一文把 ACID、隔离级别、MVCC、锁全串起来
数据库·mysql
lzhdim7 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
ltl8 小时前
ClickHouse Distributed 引擎与分布式查询路由
数据库
Wang's Blog8 小时前
PostgreSQL笔记60: 权限与角色管理——从层级体系到最佳实践
数据库·笔记·postgresql
whcyhhh9 小时前
头歌实践教学平台:大数据存储2023(六)
大数据·数据库·python
Elastic 中国社区官方博客10 小时前
让大模型思考,让小模型执行:在 Elastic Workflows 中拆分 LLM 成本
大数据·运维·数据库·人工智能·elasticsearch·ai
Faith_xzc10 小时前
一条 SQL 顶一条 Flink 链路?Doris Streaming Job 持续导入全景解析
大数据·数据库·sql·flink
这个DBA有点耶13 小时前
多模数据库深度解读:从“多库拼装”到“一库多能”的架构演进
数据库·mysql·dba
晓晓_za89866813 小时前
Geo 优化服务 CI/CD 流水线搭建:源码自动构建、测试与灰度发布
运维·服务器·tcp/ip·spring·缓存·ci/cd