Redis 缓存穿透、击穿、雪崩

一、缓存穿透

1、含义

缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。

2、解决方案

1)缓存空对象

就是当数据库中查不到数据的时候,我缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,这样下次再查询该数据的时候,就可以直接从缓存中拿到,从而达到了减小数据库压力的目的。

但这种解决方式有两个缺点:(1)需要缓存层提供更多的内存空间来缓存这些空对象,当这种空对象很多的时候,就会浪费更多的内存;(2)会导致缓存层和存储层的数据不一致,即使在缓存空对象时给它设置了一个很短的过期时间,那也会导致这一段时间内的数据不一致问题。

2)使用布隆过滤器

简单地说就是在缓存前面加了一个过滤器,查询一个数据时布隆过滤器中存在才继续查询缓存,否则直接返回空值。

注意,布隆过滤器可能误判(不存在的肯定不存在,存在的也可能不存在)

布隆过滤器算法 参考文章

二、缓存击穿

1、含义

缓存击穿是指当缓存中某个热点数据过期了,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存(并发高),直接查询数据库。

2、解决方案

1)使用分布式锁,保证同一时刻只能有一个查询请求重新加载热点数据到缓存中,这样,其他的线程只需等待该线程运行完毕,即可重新从Redis中获取数据

2)在后台同时启一个定时任务去定时地更新这个缓存。

三、缓存雪崩

1、含义

缓存雪崩是指当缓存中有大量的key在同一时刻过期,导致大量的查询请求全部到达数据库,造成数据库查询压力骤增,甚至直接挂掉。

2、解决方案

给Redis设置过期时间时额外添加一个随机时间,来打散key的过期时间

相关推荐
hweiyu0030 分钟前
Redis命令:LMOVE
redis·缓存
bug菌1 小时前
一个周末就想把短链服务推到 10 万 QPS,真能靠加 Redis 做到吗?
java·redis·go
程序员Sunday3 小时前
Redis 缓存穿透、击穿、雪崩怎么区分?从回源压力找原因
数据库·redis·缓存
guo_wen_qiang4 小时前
redis实现秒杀功能-超卖&库存遗留问题的解决
数据库·redis·缓存
逐流人4 小时前
Redis内存数据库:从数据类型到集群部署
linux·运维·数据库·redis·缓存·云计算
.Bryce.6 小时前
三协议合一实战:用MCP+A2A+ANP搭建一个智能研究助手
网络·redis·agent·codex·mcp·a2a·anp
大侠归来6 小时前
Redis Cluster 的 16384 个槽(Slot)是什么?
数据库·redis·缓存
杨运交7 小时前
[079][消息模块]基于 Redis Stream 的高可靠消息队列实现——Spring Data Redis 实战解析
数据库·redis·spring
xixingzhe28 小时前
秒杀库存三种缓存实现方案
数据库·redis·缓存
思考着亮9 小时前
1.Redis 基础知识
redis