当前位置:网站首页>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的新版视频,强烈推荐大家看一下。
边栏推荐
- Machine learning -- decision tree (sklearn)
- Pytorch实现简单线性回归Demo
- Fashion Gen: the general fashion dataset and challenge paper interpretation & dataset introduction
- Pytorch-温度预测
- Kconfig Kbuild
- 数据分析之缺失值填充(重点讲解多重插值法Miceforest)
- GNN的第一个简单案例:Cora分类
- Reno7 60W super flash charging architecture
- ToggleButton实现一个开关灯的效果
- Gallery之图片浏览、组件学习
猜你喜欢

OPPO VOOC快充电路和协议

ES6语法总结--上篇(基础篇)

Missing value filling in data analysis (focus on multiple interpolation method, miseforest)

Amba, ahb, APB, Axi Understanding

RT-Thread API参考手册

open-mmlab labelImg mmdetection

Togglebutton realizes the effect of switching lights
![Several declarations about pointers [C language]](/img/9b/ace0abbd1956123a945a98680b1e86.png)
Several declarations about pointers [C language]

Kconfig Kbuild

机器学习--线性回归(sklearn)
随机推荐
Pytorch实现简单线性回归Demo
Pytorch-温度预测
Kaggle竞赛-Two Sigma Connect: Rental Listing Inquiries
数据分析之缺失值填充(重点讲解多重插值法Miceforest)
Esp8266 connects to bafayun (TCP maker cloud) through Arduino IED
ES6语法总结--下篇(进阶篇 ES6~ES11)
Gallery's image browsing and component learning
Common properties of location
GNN的第一个简单案例:Cora分类
Reno7 60W super flash charging architecture
. elf . map . list . Hex file
几个关于指针的声明【C语言】
Basic operations of databases and tables ----- view data tables
Correspondence between STM32 model and contex M
OPPO VOOC快充电路和协议
The first simple case of GNN: Cora classification
Arduino get random number
共用体(union)详解【C语言】
物联网系统框架学习
Mysql database interview questions