Redis穿透、击穿、雪崩

server/2024/11/14 4:48:30/

redis是一款常用的非关系型数据库,我们常用与作为数据缓存的组件。
接下来介绍一下面试中常被问到的三个概念以及简单的解决方法。

穿透

什么叫缓存穿透
缓冲穿透,是当有一个请求过来时,查询redis缓存不存在,又去查询数据库(如MySQL)。数据库中也不存在这个数据,因为不存在该数据,所以不会对其做缓存,所以当下一个请求继续查询这个数据的时候,请求还是会打到数据库,这种情况就叫做缓冲穿透。

解决方法

  • 最简单的解决方法就是对数据库查询时查不到的数据也做缓存,可以缓存空对象。
  • 使用布隆过滤器预先判断数据是否存在,如果布隆过滤器返回不存在,那么可以确定数据一定不存在,直接返回错误信息,无需查询缓存数据库

击穿

什么是缓冲击穿
就是一个热点数据(比如秒杀的一个数据),短时间会有大量的请求过来。如果这个数据缓存中没有(已过期或者被删除),那么短时间(瞬时)来了大量的请求,当第一个请求打到数据库,但是还没有做好数据的缓存,第2、3、4、…一堆请求都过来了,请求都会一并打到数据库

解决方法

  • 设置合理的过期时间,已经每次访问后更新过期时间
  • 预热缓冲
  • 使用分布式锁

雪崩

什么是雪崩
雪崩和击穿类似,击穿是一个热点数据,雪崩是同一时间大量缓冲过期,导致请求直接打到数据库

解决方法

  • 合理设计过期时间,使过期时间均布(或随机)
  • 使用分布式锁

http://www.ppmy.cn/server/141762.html

相关文章

【k8s】ClusterIP能http访问,但是不能ping 的原因

ClusterIP 服务在 Kubernetes 中是可以访问的,但通常无法通过 ping 命令来测试连通性。这主要是因为 ClusterIP 是一个虚拟 IP 地址,而不是实际分配给某个网络接口的 IP 地址。以下是一些原因和解释: 1. 虚拟 IP 地址 ClusterIP 是一个虚拟…

Redis 补充概念

什么是key 在redis中的key是用于唯一标识存储在redis数据库中的数据的字符串对象 其中每个key在Redis数据库中是唯一的 不允许相同的key存在的 redission的概念 Redission 是一个在Redis的基础上实现的Java驻内存数据网格 它提供了丰富的分布式数据结构和服务 包括分布式锁…

常用的c++新特性-->day03

断言和异常 断言断言的基本使用 静态断言静态断言的基本使用 异常异常基本使用c98异常案例 noexceptnoexcept简单案例 断言 断言的基本使用 #include <iostream> #include <cassert>// >>>>>>>>>>>>>>>> 断言的…

微信小程序_小程序视图与逻辑_day3

一、目标 A. 能够知道如何实现页面之间的导航跳转 B. 能够知道如何实现下拉刷新效果 C. 能够知道如何实现上拉加载更多效果 D. 能够知道小程序中常用的生命周期 二、目录 A. 页面导航 B. 页面事件 C. 生命周期 D. WXS脚本 E. 案例-本地生活&#xff08;列表页面&#xff09;…

【C++课程学习】:string的模拟实现

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一.string的主体框架&#xff1a; 二.string的分析&#xff1a; &#x1f354;构造函数和析构函数&a…

Android 下内联汇编,Android Studio 汇编开发

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 内联汇编 Android 内联汇编非常适用于 ARM 架构的性能优化和底层操作&#xff0c;通常用于加密、解密、特定指令优化等领域。 1. 基础语法 内联汇编在 C/C …

【C++】list 与 string 基础与实现字符串操作

【C】使用 list 与 string 实现基础字符串操作 文章目录 一、字符串的基础操作1.1 - startsWith1.2 - endsWith1.3 - trim1.4 - indexOf1.5 - replaceAll 二、list 基础操作2.1 - 遍历2.1.1 - 使用迭代器访问2.1.2 - 使用基于范围的 for 循环遍历2.1.3 - 使用标准算法库遍历 2.…

记录no.26

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>; 函数递归 //void print(int a) //{ // if (a > 9) // { // print(a / 10);//这里开始递归 // } // printf("%d ", a % 10); //} //int main() //{ // int a 0; // scanf…