当前位置:网站首页>Redis 缓存更新策略,缓存穿透、雪崩、击穿问题
Redis 缓存更新策略,缓存穿透、雪崩、击穿问题
2022-07-06 09:17:00 【阿杆.】
前言
本文是由我学习自黑马程序员B站视频教程(https://www.bilibili.com/video/BV1cr4y1671t)的过程中做的笔记,主要是记录Redis做缓存的一些思想,并未涉及代码。
Redis缓存
作用
- 降低后端负载
- 提高读写效率,降低响应时间
成本
- 数据一致性成本
- 代码维护成本
- 运维成本
缓存更新策略
内存淘汰
内容不足时自动淘汰
默认开启
不用自己维护
一致性差
维护成本低
超时剔除
添加TTL到期自动删除
一致性一般
维护成本低
主动更新
编写业务逻辑,在修改数据库时,更新缓存
一致性较好
维护成本较高
根据业务场景选择:
低一致性需求:使用Redis自带的内存淘汰机制。
高一致性需求:主动更新,并启用超时剔除,
读操作
缓存命中则直接返回
未命中则查询数据库,并写入缓存
写操作
先写数据库,然后再删除缓存
要确保数据库与缓存操作的原子性(单体应用可以使用@Transactional开启事务)
缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
常见的解决方案有两种:
- 缓存空对象
- 优点:实现简单,维护方便
- 缺点:额外的内存消耗、 可能造成短期的不一致
- 布隆过滤(基于bitmap实现)
- 优点:内存占用较少,没有多余key
- 缺点:实现复杂、存在误判可能
(左侧为缓存空对象示意图,右侧为布隆过滤示意图)
缓存雪崩
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
(左侧为大量缓存失效示意图,右侧为redis宕机示意图)
解决方案:
- 给不同的Key的TTL添加随机值
- 利用Redis集群提高服务的可用性
- 给缓存业务添加降级限流策略
- 给业务添加多级缓存(浏览器缓存、Nginx缓存、Redis缓存、JVM本地缓存、数据库等等)
缓存击穿
缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。
常见的解决方案有两种:
逻辑过期
不设置TTL,而是在数据内添加一个expire字段,当该字段时间达到时,更新数据。
- 优点
- 线程无需等待,性能较好
- 缺点
- 不保证一致性
- 有额外内存消耗
- 实现复杂
- 优点
互斥锁
- 优点
- 没有额外的内存消耗
- 保证一致性
- 实现简单
- 缺点
- 线程需要等待,性能受影响
- 可能有死锁风险
(左侧为互斥锁示意图,右侧围逻辑过期示意图)
- 优点
基于互斥锁的方式解决缓存击穿问题
基于逻辑过期方式解决缓存击穿问题
后记
u1s1,这个教程讲的真的不错,而且是2022的新版视频,强烈推荐大家看一下。
边栏推荐
猜你喜欢
JS变量类型以及常用类型转换
电商数据分析--用户行为分析
RT-Thread 线程的时间片轮询调度
STM32 如何定位导致发生 hard fault 的代码段
Machine learning -- linear regression (sklearn)
Detailed explanation of 5g working principle (explanation & illustration)
ToggleButton实现一个开关灯的效果
【ESP32学习-1】Arduino ESP32开发环境搭建
Basic operations of databases and tables ----- view data tables
I2C总线时序详解
随机推荐
level16
Missing value filling in data analysis (focus on multiple interpolation method, miseforest)
电商数据分析--薪资预测(线性回归)
Basic operations of databases and tables ----- view data tables
Mp3mini playback module Arduino < dfrobotdfplayermini H> function explanation
ESP学习问题记录
嵌入式启动流程
Comparison of solutions of Qualcomm & MTK & Kirin mobile platform USB3.0
Gallery之图片浏览、组件学习
Embedded startup process
[esp32 learning-2] esp32 address mapping
Analysis of charging architecture of glory magic 3pro
js 变量作用域和函数的学习笔记
列表的使用
IOT system framework learning
Fashion Gen: the general fashion dataset and challenge paper interpretation & dataset introduction
Redis interview questions
Kconfig Kbuild
RT-Thread 线程的时间片轮询调度
Selective sorting and bubble sorting [C language]