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部分失效,本地缓存仍可拦截部分请求,降低瞬时压力

相关推荐
盖世英雄酱581361 小时前
6000条数据执行时间9s(二)
数据库·后端
_376271531 小时前
MySQL主从复制如何实现读写分离_利用ProxySQL进行流量分发
jvm·数据库·python
2401_833033621 小时前
SQL如何提高分组统计查询的响应速度_索引与缓存策略
jvm·数据库·python
是梦终空1 小时前
计算机源码273—基于SpringBoot+Vue3停车场管理系统带支沙箱支付(源代码+数据库)
数据库·spring boot·vue·mybatis·停车场管理系统·沙箱支付·毕设设计
Filwaod1 小时前
Java面试:AIGC场景下的技术深度拷问-谢飞机篇
spring boot·缓存·微服务·消息队列·aigc·java面试·ai技术
dinglu1030DL1 小时前
C#怎么实现发布订阅模式 C#如何用事件总线EventBus实现模块间的松耦合消息通信【架构】
jvm·数据库·python
神明9311 小时前
PHP函数怎样利用硬件内存压缩功能_PHP启用zswap硬件加速【指南】
jvm·数据库·python
曹牧1 小时前
PL/SQL:视图(View)比较
数据库·sql
2301_781571421 小时前
如何配置用户的资源使用上限_MAX_QUERIES_PER_HOUR查询频率限制
jvm·数据库·python