什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?

缓存雪崩:在一个时间段内,有大量的key过期,或者Redis服务宕机,导致大量的请求到达数据库,带来巨大压力

  • 给key设置不同的TTL、利用Redis集群提高服务的高可用性、添加多级缓存、添加降级流策略

缓存击穿:给某一个key设置了过期时间,当key过期的时间,恰好这个时间点有大量的并发请求访问这个key,可能会瞬间把数据库压垮

  • 互斥锁:缓存失败时,只允许一个请求去加载数据并更新缓存,其他请求阻塞等待

  • 逻辑过期时间:不给key设置过期时间,而是添加一个逻辑过期时间字段,查询缓存发现逻辑过期时间已过期时,再获取互斥锁,如果获取成功,则开启一个新线程去查询数据并更新缓存,失败则返回过期数据

缓存穿透;访问一个不存在的数据,在数据库没有读取到也不会直接写入缓存,导致每次请求都到达数据库,带来压力

  • 缓存空数据:查询返回的数据为空,仍然将空数据缓存;实现简单、消耗内存

  • 布隆过滤器:将可能存在的数据哈希到一个足够大的bitmap,可以过滤掉一些不存在的数据,避免了DB的查询

缓存预热:在系统启动或缓存失效后,提前将部分数据加载到Redis缓存中,提高系统的响应速度和性能

相关推荐
1024奇点7 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch8 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
我不会起名字3228 小时前
Redis 从 0 到 1(十七):订单 30 分钟不支付自动关闭——ZSet 延迟队列 Go 实现
redis·go·延迟队列·zset·订单
天河归来8 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL9 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
利威尔xu9 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
FRing039 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
by2099910 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河10 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
利威尔xu10 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang