当前位置:网站首页>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的新版视频,强烈推荐大家看一下。
边栏推荐
- IOT system framework learning
- Principle and implementation of MySQL master-slave replication
- GNN的第一个简单案例:Cora分类
- RT-Thread 线程的时间片轮询调度
- Pytoch implements simple linear regression demo
- 共用体(union)详解【C语言】
- E-commerce data analysis -- User Behavior Analysis
- C语言,log打印文件名、函数名、行号、日期时间
- Missing value filling in data analysis (focus on multiple interpolation method, miseforest)
- Reno7 60W super flash charging architecture
猜你喜欢
共用体(union)详解【C语言】
Kconfig Kbuild
JS数组常用方法的分类、理解和运用
Machine learning -- decision tree (sklearn)
STM32 如何定位导致发生 hard fault 的代码段
Arduino JSON data information parsing
Analysis of charging architecture of glory magic 3pro
level16
Arm pc=pc+8 is the most understandable explanation
Comparaison des solutions pour la plate - forme mobile Qualcomm & MTK & Kirin USB 3.0
随机推荐
Amba, ahb, APB, Axi Understanding
arduino JSON数据信息解析
AMBA、AHB、APB、AXI的理解
ES6语法总结--上篇(基础篇)
Dead loop in FreeRTOS task function
Kaggle竞赛-Two Sigma Connect: Rental Listing Inquiries(XGBoost)
RT-Thread 线程的时间片轮询调度
Esp8266 uses Arduino to connect Alibaba cloud Internet of things
VSCode基础配置
open-mmlab labelImg mmdetection
Gallery's image browsing and component learning
RT-Thread的main线程“卡死”的一种可能原因及解决方案
gcc 编译选项
机器学习--线性回归(sklearn)
A possible cause and solution of "stuck" main thread of RT thread
Linux Yum install MySQL
ESP学习问题记录
Arduino gets the length of the array
ESP learning problem record
Arduino JSON data information parsing