当前位置:网站首页>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的新版视频,强烈推荐大家看一下。
边栏推荐
- GCC compilation options
- level16
- 荣耀Magic 3Pro 充电架构分析
- [esp32 learning-1] construction of Arduino esp32 development environment
- sklearn之feature_extraction.text.CountVectorizer / TfidVectorizer
- Arduino JSON data information parsing
- Inline detailed explanation [C language]
- Variable parameter principle of C language function: VA_ start、va_ Arg and VA_ end
- Kaggle competition two Sigma connect: rental listing inquiries
- ESP8266通过Arduino IDE连接Onenet云平台(MQTT)
猜你喜欢

锂电池基础知识
![Several declarations about pointers [C language]](/img/9b/ace0abbd1956123a945a98680b1e86.png)
Several declarations about pointers [C language]

数据分析之缺失值填充(重点讲解多重插值法Miceforest)

Apprentissage automatique - - régression linéaire (sklearn)

高通&MTK&麒麟 手機平臺USB3.0方案對比

R & D thinking 01 ----- classic of embedded intelligent product development process

几个关于指针的声明【C语言】

OPPO VOOC快充电路和协议

js 变量作用域和函数的学习笔记

I2C bus timing explanation
随机推荐
Vscode basic configuration
ES6 grammar summary -- Part 2 (advanced part es6~es11)
map文件粗略分析
冒泡排序【C语言】
[esp32 learning-2] esp32 address mapping
C语言回调函数【C语言】
Kaggle competition two Sigma connect: rental listing inquiries
机器学习--线性回归(sklearn)
Comparaison des solutions pour la plate - forme mobile Qualcomm & MTK & Kirin USB 3.0
Reading notes of difficult career creation
History object
ES6 grammar summary -- Part I (basic)
Basic operations of databases and tables ----- modifying data tables
Raspberry pie tap switch button to use
I2C总线时序详解
程序员老鸟都会搞错的问题 C语言基础 指针和数组
ESP8266通过Arduino IDE连接Onenet云平台(MQTT)
RT thread API reference manual
Understanding of AMBA, AHB, APB and Axi
Implementation scheme of distributed transaction