当前位置: 首页 > news >正文

Redis面经

Redis面经

  • Redis缓存穿透、缓存击穿和缓存雪崩及解决方案
    • 概述
    • 缓存穿透详解及解决方案
    • 缓存击穿详解及解决方案
    • 缓存雪崩详解及解决方案
  • Redis持久化机制
    • 什么是数据持久化?
    • Redis数据持久化概述
    • RDB持久化的优缺点
    • AOF持久化
    • 混合持久化

Redis缓存穿透、缓存击穿和缓存雪崩及解决方案

概述

三者的根本原因在于,Redis命中率下降,请求直接打在了数据库上。
在正常的情况下,大部分的资源请求都可以被Redis响应,没有被Redis响应的小部分请求会转向数据库,这样的话,数据库DB的压力不会太大,是可以正常工作的。然而,如果大量高并发请求同时打在了Redis上,请求并没有在Redis上找到相应的资源,也就是Redis没有响应,命中率降低。这些请求就只能转向数据库,在大量高并发的请求之下,导致数据库压力瞬间增大,从而造成数据库服务器卡死或者宕机。而导致Redis命中率下降的原因就可以分为三种,分别对应着缓存穿透、缓存击穿和缓存雪崩。

缓存穿透详解及解决方案

缓存穿透是指请求根本不存在的资源,数据库中没有,Redis中更不会有。例如,客户端发送大量无法响应的请求,类似于“http://localhost:8080/user/199?id=-1”,数据库本身就不存在id=-1的用户数据,Redis中就更不可能存在,那么这些请求就得不到响应,就会直接打在数据库上。缓存穿透通常是黑客所为,黑客发送大量的无法响应的请求给服务器,由于请求的资源根本不存在,从而导致数据库压力过大而卡死或宕机。
解决方案

  1. 对空值进行缓存:类似于上面的例子,由于数据库中没有id=-1的用户数据,可以在Redis中对它进行缓存,即key=-1,value=null。这样的话,当请求到达Redis的时候就会直接返回一个null给客户端,避免了Redis无法响应的问题。需要注意的是,对空值进行缓存时,key的过期时间不能设置太长,以免占用太多Redis资源,而且对空值进行缓存是一种很被动的防御方式,当遇到黑客请求大量不存在的资源就需要写入大量的null值到Redis中,可能会导致Redis内存不足。
  2. 实时监控,拒绝黑客攻击:当Redis命中率出现大大下降的情况,就要配合运维人员对访问对象和访问数据进行分析排查,从而进行黑名单的设置,拒绝黑客攻击。
  3. 使用布隆过滤器:使用BitMap作为布隆过滤器,将可以访问的资源通过简单的映射关系放到布隆过滤器中,例如哈希计算。当请求来临时,首先将请求放入布隆过滤器进行判断,如果有相应资源则放行,如果没有则直接拦截。需要注意的是,布隆过滤器是有一定误差的,一般需要配合其他限制来解决缓存穿透问题。
  4. 接口校验。类似于用户权限的拦截,对于id=-1这种无效请求直接进行拦截,不允许这些请求到达Redis和数据库上。

缓存击穿详解及解决方案

缓存击穿是指Redis中某个热点key过期,此时有大量的用户访问该key,大量高并发的对于该key的请求没有得到Redis的响应,就会转向数据库,导致数据库服务器瘫痪。
解决方案

  1. 提前对热点数据进行设置:在一些新闻资讯平台或软件上,需要对热点数据提前设置在Redis缓存中。
  2. 监控数据,适时调整:监控哪些数据是热门数据,实时调整key的过期时长。
  3. 使用锁机制:只有一个请求可以获得互斥锁,请求在数据库中查询数据并将结果返回给Redis,这样其他请求就可以从Redis中得到响应。

缓存雪崩详解及解决方案

缓存雪崩像是缓存击穿的promax版,Redis中的key集体过期,相当于Redis中的大部分数据被清空了或者说是失效了,那么此时Redis中由于没有相应数据就无法响应大量高并发的请求,命中率急剧下降,请求都打在了数据库上,数据库服务器直接崩溃。
解决方案

  1. 将失效时间分散开:使用自动生成随机数使得key的过期时间是随机的,防止集体过期。
  2. 使用多级缓存架构:使用Nginx缓存+Redis缓存+其他缓存,不同层使用不同的缓存,提高了系统的可靠性。
  3. 设置缓存标记:记录缓存数据是否过期,如果过期就会触发另外的后台线程实时更新过期的key。
  4. 使用锁或者队列的方式:请求不到的资源加上排它锁,其他请求就只能等待。

Redis持久化机制

什么是数据持久化?

数据持久化就是将数据从内存写入磁盘,目的在于防止数据丢失。内存中的数据在服务器重启或者断电时会丢失,而磁盘中的数据不会,为了确保系统的稳定性,需要进行数据的持久化操作。

Redis数据持久化概述

Redis是一种基于内存的数据库,同时,也支持将数据写入数据库,这个过程就叫做Redis数据持久化。
Redis持久化方法主要有以下三种:

  1. 快照方式(Redis database,RDB):将某一时刻的内存数据生成Snapshot快照,以二进制的形式写入磁盘,由于是以二进制的方式写入磁盘,因此效率很高,但是一旦Redis意外终止,就会导致部分数据丢失。
  2. 命令追加方式(Append only file,AOF):记录Redis数据的所有写操作指令,以文本的形式追加到AOF文件中,由于是以文本的形式写入,因此效率比较低,但是AOF文件记录了所有写操作指令,在Redis服务重启时,只需要从头到尾重新执行一遍AOF文件中的命令即可回复数据保证数据的完整性。
  3. 混合持久化方式:Redis4.0之后新增的方式,结合了RDB和AOF的优点,将RDB 文件和 AOF 日志文件存在一起,这里的 AOF 日志不再是全量的日志,而是自持久化开始到持久化结束的这段时间发生的增量 AOF 日志,通常这部分 AOF 日志很小。在写入的时候,先把当前数据以 RDB 形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能降低数据丢失的风险。因此,混合持久化适用于对数据安全性和性能要求较高的场景。

RDB持久化的优缺点

优点

  1. RDB文件数据以二进制的形式存在,占用内存小,文件更加紧凑,适合于文件备份。
  2. RDB适合灾难恢复,由于其文件紧凑,可以更高效率地传输给远程服务器提供Redis服务。
  3. RDB可以提高Redis的运行速度,每次持久化Redis主线程会fork出一个子进程,子进程负责快照持久化,将内存数据存储到磁盘,而Redis主进程继续负责处理客户端请求,不会执行磁盘I/O等操作。
  4. 与AOF格式文件相比,RDB文件可以更快地重启,因为二进制方式写入磁盘的效率要比文本方式写入磁盘的效率要高。

缺点

  1. 由于RDB只能保存某一时间段的数据,因此一旦中途Redis服务意外终止,则会丢失一段时间的Redis数据。
  2. RDB需要经常fork()才能使用子进程将内存数据持久化在磁盘中,一旦数据集过大,fork()会很耗时,如果再加上CPU性能不佳,可能会导致Redis停止为客户端服务几毫秒甚至一秒钟。

AOF持久化

优点

  1. AOF持久化保存的数据更加完整。因为AOF提供了三种保存策略:“每次操作保存、每秒钟保存一次和跟随系统持久化策略保存”,其中,每秒钟保存一次是AOF的默认保存策略,从数据安全性和性能方面来讲都是很不错的选择,即使发生意外,最多丢失一秒钟的数据。
  2. AOF采用命令追加的写入方式,不会出现文件损坏问题,即使有意外情况,也可以使用redis-check-aof工具轻松修复。
  3. AOF持久化文件很容易解析,因为它是把所有Redis键值操作命令以文本的形式写入磁盘,即使不小心使用flush all命令删除了所有的键值信息,只要使用AOF文件删除最后的flush all命令,重启Redis服务即可恢复之前误删的数据。

缺点

  1. 对于相同的数据集,AOP文件要大于RDB文件。
  2. 在Redis负载比较高的情况下,RDB要比AOF性能更好。
  3. RDB使用快照持久化数据,AOF使用命令追加到AOF文件,从数据完整性和可靠性的角度来看,RDB比AOF更加健壮、易于维护。

混合持久化

优点
既能提高Redis服务启动的速度,还能保证数据的完整性和安全性,降低了丢失大量数据的风险。
缺点

  1. AOF文件中添加了RDB格式的内容,使得AOF文件可读性变差。
  2. 混合持久化不能在Redis4.0之前的版本使用,兼容性差。

相关文章:

Redis面经

Redis面经 Redis缓存穿透、缓存击穿和缓存雪崩及解决方案概述缓存穿透详解及解决方案缓存击穿详解及解决方案缓存雪崩详解及解决方案 Redis持久化机制什么是数据持久化?Redis数据持久化概述RDB持久化的优缺点AOF持久化混合持久化 Redis缓存穿透、缓存击穿和缓存雪崩…...

【c++】类和对象(六)深入了解隐式类型转换

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来到初始化列表,隐式类型转换以及explicit的内容 目录 1.初始化列表1.1构造函数体赋值1.2初始化列表1.2.1隐式类型转换与复制初始化 1.3e…...

什么是nginx正向代理和反向代理?

什么是代理? 代理(Proxy), 简单理解就是自己做不了的事情或实现不了的功能,委托别人去做。 什么是正向代理? 在nginx中,正向代理指委托者是客户端,即被代理的对象是客户端 在这幅图中,由于左边内网中…...

【Go】面向萌新的Gin框架知识梳理学习笔记

目录 Gin框架简介 路由&路由组 1. 定义基本路由 2. 参数传递 3. 查询字符串参数 4. 路由组 5. 路由中间件 模板渲染 1. 加载模板 2. 定义模板 3. 渲染模板 4. 自定义模板函数 返回json 1. 导入 Gin 包 2. 创建 Gin 引擎 3. 定义路由和处理器函数 4. 运行服…...

baseDao增删改查.

这里写目录标题 1、baseDao增删改查介绍2、basDao类3、BasDao类的作用 1、baseDao增删改查介绍 (1)、增加Create)操作: 通过BaseDao的insert方法可以向数据库中插入一条新的记录。 该方法接受一个实体对象作参数,将该对象的属性映射到表的字…...

什么是面向对象【大白话Java面试题】

什么是面向对象 同样是解决一个问题,面向对象的角度是将问题抽象成对象的形式。通过分类的思维方式,将问题分成几个解决方案的对象。给每个对象赋值属性和方法,对每个对象的细节进行面向过程的思维,执行自己的方法来解决问题。 …...

PyTorch 教程-快速上手指南

文章目录 PyTorch Quickstart1.处理数据2.创建模型3.优化模型参数4.保存模型5.加载模型 PyTorch 基础入门1.Tensors1.1初始化张量1.2张量的属性1.3张量运算1.3.1张量的索引和切片1.3.2张量的连接1.3.3算术运算1.3.4单元素张量转变为Python数值 1.4Tensor与NumPy的桥接1.4.1Tens…...

【有芯职说】数字芯片BES工程师

一、 数字芯片BES工程师简介 今天来聊聊数字芯片BES工程师,其中BES是Back End Support的缩写,就是后端支持的意思。其实这个岗位是数字IC前端设计和数字IC后端设计之间的一座桥,完成从寄存器传输级设计到具体工艺的mapping和实现。这个岗位在…...

暴力破解pdf文档密码

首先安装pdfcrack工具包 apt install pdfcrack 默认密码字典存储在/usr/share/wordlists里,是gz文件,将它解压并copy到pdf目录 然后使用pdfcrack破解 密码在最后一行user-password的单引号里...

蓝桥杯刷题第四天

思路: 这道题很容易即可发现就是简单的暴力即可完成题目,我们只需满足所有数的和为偶数即可保证有满足条件的分法,同时也不需要存下每个输入的数据,只需要知道他是偶数还是奇数即可,因为我们只需要偶数个奇数搭配在一块…...

03-数据库的用户管理

一、创建新用户 mysql> create user xjzw10.0.0.% identified by 1; Query OK, 0 rows affected (0.01 sec) 二、查看当前数据库正在登录的用户 mysql> select user(); ---------------- | user() | ---------------- | rootlocalhost | ---------------- 1 row …...

每日一题 --- 三数之和[力扣][Go]

三数之和 题目:15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 **注意&#x…...

vue render 函数详解 (配参数详解)

vue render 函数详解 (配参数详解) 在 Vue 3 中,render 函数被用来代替 Vue 2 中的模板语法。 它接收一个 h 函数(或者是 createElement 函数的别名),并且返回一个虚拟 DOM。 render 函数的语法结构如下: render(h) …...

ubuntu23.10配置RUST开发环境

系统版本: gcc版本 下载rustup安装脚本: curl --proto =https --tlsv1.2 https://sh.rustup.rs -sSf | sh下载完成后会自动执行 选择默认安装选项 添加cargo安装目录到环境变量 vim ~/.bashrc<...

Vue性能优化--gZip

一、gZip简单介绍 1.1 什么是gzip gzip是GNUzip的缩写&#xff0c;最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术&#xff0c;web服务器和客户端&#xff08;浏览器&#xff09;必须共同支持gzip。目前主流的浏览器&#xff0c;Chro…...

蓝桥杯第七届大学B组详解

目录 1.煤球数量&#xff1b; 2.生日蜡烛&#xff1b; 3.凑算式 4.方格填数 5.四平方和 6.交换瓶子 7.最大比例 1.煤球数量 题目解析&#xff1a;可以根据题目的意思&#xff0c;找到规律。 1 *- 1个 2 *** 3个 3 ****** 6个 4 ********** 10个 不难发现 第…...

荣誉 | 人大金仓连续三年入选“金融信创优秀解决方案”

3月28日&#xff0c;由中国人民银行领导&#xff0c;中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布“第三期金融信创优秀解决方案”&#xff0c;人大金仓新一代手机银行系统解决方案成功入选&#xff0c;这也是人大金仓金融行业解决方案连续第三年获得用户认可。…...

【关于jupyter notebook】一打开就闪退的问题

在Anaconda Prompt中输入jupyter notebook发现是有个错误。 里面多了一个__init__.py的文件导致报错。删除之后&#xff0c;就可以使用了...

若依 3.8.7版本springboot前后端分离 整合mabatis plus

1.去掉mybatis 这一步我没有操作&#xff0c;看别人的博客有说不去掉可能冲突&#xff0c;也可能不冲突&#xff0c;我试下来就没去掉如需要去除&#xff0c;到总的pom.xml中properties标签下的<mybatis-spring-boot.version>x.x.x</mybatis-spring-boot.version>…...

vue做移动端自适应插件实现rem

1.实现方式 postcss-pxtorem&#xff1a;将px转换为rem amfe-flexible&#xff1a;为html、body提那家font-size&#xff0c;窗口调整的时候重新设置font-size 2.安装与使用 npm install amfe-flexible --save npm install postcss-pxtorem --save-dev 1.再main.js入口文件…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...