当前位置:网站首页>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的新版视频,强烈推荐大家看一下。
边栏推荐
- Principle and implementation of MySQL master-slave replication
- Understanding of AMBA, AHB, APB and Axi
- Comparaison des solutions pour la plate - forme mobile Qualcomm & MTK & Kirin USB 3.0
- Kaggle competition two Sigma connect: rental listing inquiries (xgboost)
- Esp8266 connects to bafayun (TCP maker cloud) through Arduino IED
- Correspondence between STM32 model and contex M
- The first simple case of GNN: Cora classification
- Machine learning -- decision tree (sklearn)
- Mp3mini playback module Arduino < dfrobotdfplayermini H> function explanation
- Basic operations of databases and tables ----- view data tables
猜你喜欢

RT thread API reference manual

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

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

ES6语法总结--下篇(进阶篇 ES6~ES11)

I2C bus timing explanation

Arduino uno R3 register writing method (1) -- pin level state change

电商数据分析--薪资预测(线性回归)

Basic operations of databases and tables ----- creating data tables

Kaggle competition two Sigma connect: rental listing inquiries (xgboost)

RT-Thread的main线程“卡死”的一种可能原因及解决方案
随机推荐
Unit test - unittest framework
Embedded startup process
Kaggle competition two Sigma connect: rental listing inquiries (xgboost)
共用体(union)详解【C语言】
OSPF message details - LSA overview
arduino UNO R3的寄存器写法(1)-----引脚电平状态变化
MySQL START SLAVE Syntax
物联网系统框架学习
Kaggle competition two Sigma connect: rental listing inquiries
Arduino get random number
open-mmlab labelImg mmdetection
关键字 inline (内联函数)用法解析【C语言】
Several declarations about pointers [C language]
FTP file upload file implementation, regularly scan folders to upload files in the specified format to the server, C language to realize FTP file upload details and code case implementation
There are three iPhone se 2022 models in the Eurasian Economic Commission database
Variable parameter principle of C language function: VA_ start、va_ Arg and VA_ end
Pytorch-温度预测
Feature of sklearn_ extraction. text. CountVectorizer / TfidVectorizer
Arduino JSON data information parsing
Cannot change version of project facet Dynamic Web Module to 2.3.