Redis 2023面试5题(三)

news2024/12/25 23:47:44

一、Redis集群数据hash分片算法是怎么回事?

Redis集群数据hash分片算法是一种将数据分散存储在不同的节点上来实现的机制。具体来说,Redis集群将数据分成16384个槽位,每个槽位对应一个节点。当需要访问某个key时,Redis会根据key的哈希值计算出该key所在的槽位,然后从对应的节点中获取该key的数据 。

槽位定位算法

Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。
HASH SLOT = CRC16(key) mod 16384
再根据槽位值和Redis节点的对应关系就可以定位到key具体是落在哪个Redis节点上的。

如图:
在这里插入图片描述

二、Redis命令会不会造成死循环阻塞?

1. Redis 命令本身不会造成死循环阻塞。 如果使用不当,有可能造成死循环阻塞。

因为在 Redis 中执行了一个需要不断执行且不返回结果的命令,导致该命令一直在事件队列中等待处理,从而造成了死循环阻塞。为了避免这种情况,应该确保在 Redis 中执行的命令是具有返回结果的,并避免执行需要长时间运行的命令,以免影响 Redis 的性能和响应速度。

2. Reids集群,如果在 slave 上执行 RANDOMEKY命令,那么有可能造成死循环阻塞。

slave 自己是不会清理过期 key,当一个 key 要过期时,master 会先清理删除它,之后 master 向 slave 发送一个 DEL 命令,告知 slave 也删除这个 key,以此达到主从库的数据一致性。
假设Redis 中存在大量已过期还未被清理的 key,那在 slave 上执行 RANDOMKEY 时,就会发生以下问题:

1、slave 随机取出一个 key,判断是否已过期。
2、key 已过期,但 slave 不会删除它,而是继续随机寻找不过期的 key。
3、由于大量 key 都已过期,那 slave 就会寻找不到符合条件的 key,此时就会陷入死循环

也就是说,在 slave 上执行 RANDOMKEY,有可能会造成整个 Redis 实例卡死。

这其实是 Redis 的一个 Bug,这个 Bug 一直持续到 5.0 才被修复,修复的解决方案就是在slave中最多找定的次数,无论是否能找到,都会退出循环。

三、Redis主从切换导致缓存雪崩怎么处理?

Redis主从切换可能导致缓存雪崩的情况,这是因为当主节点故障时,从节点中可能存在不一致的数据。当主节点恢复后,从节点晋升为主节点,此时该节点的数据可能比其他从节点的数据更旧,导致其他从节点在同步数据时可能会出现缓存雪崩的情况。

1、雪崩示例:

我们假设,slave 的机器时钟比 master 走得快很多。

此时,Redis master里设置了过期时间的key,从 slave 角度来看,可能会有很多在 master 里没过期的数据其实已经过期了。

如果此时操作主从切换,把 slave 提升为新的 master。
它成为 master 后,就会开始大量清理过期 key,此时就会导致以下结果:

  1. master 大量清理过期 key,主线程可能会发生阻塞,无法及时处理客户端请求
  2. Redis 中数据大量过期,引发缓存雪崩。

当 master与slave 机器时钟严重不一致时,对业务的影响非常大

所以,我们一定要保证主从库的机器时钟一致性,避免发生这些问题。

2、为了解决这个问题,可以采取以下措施:

  1. 增加 Redis 节点数量:通过增加 Redis 节点数量,可以降低缓存雪崩的风险。
  2. 使用 Redis Sentinel哨兵架构:Redis Sentinel 是一个自动故障转移机制,它可以检测到主节点故障并自动将从节点晋升为新主节点。Sentinel 还可以对新主节点进行投票,确保新主节点具有足够的权限。
  3. 使用 Redis Cluster集群架构:Redis Cluster 是一个分布式集群方案,它可以更好地处理缓存雪崩的情况。在 Redis Cluster 中,每个节点都是等价的,都可以处理读写请求。当一个节点故障时,其他节点可以继续提供服务,并且故障节点上的数据也可以在其他节点上恢复。
  4. 实现缓存淘汰策略:可以使用缓存淘汰策略,如 LRU(Least Recently Used)或 LFU(Least Frequently Used)等,来定期清理缓存。这样可以避免缓存过多过时数据,降低缓存雪崩的风险。
  5. 调整 Redis 内存限制:可以通过调整 Redis 的内存限制来控制缓存的大小。当 Redis 的内存使用达到限制时,可以触发缓存淘汰策略,从而避免缓存雪崩的发生。

综上所述,通过增加 Redis 节点数量、使用 Redis Sentinel 或 Cluster、实现缓存淘汰策略以及调整 Redis 内存限制等措施,可以有效地处理 Redis 主从切换导致的缓存雪崩问题。

四、Redis持久化RDB、AOF与混合持久化的含义与区别

Redis 持久化是指将 Redis 内存中的数据保存到磁盘上的过程,以防止断电或其他异常情况导致数据丢失。Redis 提供了两种主要的持久化方式:RDB 持久化和 AOF 持久化,两者之间的区别如下:

1. RDB 持久化(Redis DataBase):

RDB 持久化是通过生成一个特定格式的 Redis 数据快照文件(dump.rdb)来保存数据。快照文件是一个经过压缩的二进制文件,包含了 Redis 内存中的所有数据。RDB 持久化的优点是生成快照文件的速度较快,适用于数据量大或性能要求较高的场景。但是,RDB 持久化无法记录 Redis 内存中的所有数据变化,因此在恢复数据时可能存在一定程度的丢失。

2. AOF 持久化(Append Only File):

AOF 持久化是通过记录 Redis 内存中的所有写命令到一个 AOF 文件中来保存数据。AOF 文件是一个文本文件,每个写命令都会被记录下来,并按照时间顺序保存在文件中。AOF 持久化的优点是可以详细记录数据的所有变化,因此在恢复数据时可以做到完全不丢失。但是,由于 AOF 文件是一个文本文件,写入速度较慢,适用于数据较小或数据变化较少但需要完整记录的场景。

3. 混合持久化:

混合持久化是同时使用 RDB 和 AOF 两种持久化方式来保存数据。在混合持久化模式下,Redis 会根据配置文件中的规则,将一些常用的数据保存到 RDB 快照文件中,其他的数据则记录到 AOF 文件中。混合持久化的优点是可以兼顾 RDB 和 AOF 的优点,既可以在恢复数据时做到不丢失,也可以通过 RDB 快速加载数据。但是,由于同时使用两种持久化方式会带来额外的开销,因此需要根据实际情况选择合适的配置参数。

五、如何修改Redis持久化RDB的配置

  1. 打开 Redis 的配置文件,通常位于 /etc/redis/redis.conf 或 ~/.redis/config。
vi  /etc/redis/redis.conf 
  1. 在 appendonly 指令中设置参数为 yes,以启用 AOF 持久化。
appendonly yes
  1. 在 appendfilename 指令中设置 AOF 文件的名称。
appendfilename "dump.aof"
  1. 在 appendfsync 指令中设置 AOF 文件的同步策略。可以选择 always、everysec 或 no。
appendfsync always
  1. 在 save 指令中设置 Redis 快照文件的保存时间间隔。例如,以下配置表示每隔 60 秒保存一次快照文件。
save 60 10000
  1. 保存配置文件并重新启动 Redis 服务。
redis-server /etc/redis/redis.conf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx主配置文件及实战案例

文章目录 一.nginx主配置文件nginx.conf1.认识nginx服务的主配置文件2.全局配置3.I/O事件配置4.HTTP配置5.检查配置文件是否正确6.浏览器测试7.总配置文件图示7.1 nginx总配置文件的三个模块7.2 HTTP文件配置的图示&am…

【Matlab】语音信号分析与处理实验报告

一、目的 使用Matlab分析与设计实验,理解与掌握以下知识点: 1、信号的采样、频谱混叠 2、信号的频谱分析 3、信号的幅度调制与解调方法 4、理想滤波器的时域和频域特性 5、数字滤波器的设计与实现 二、内容 1、录制一段个人的语音信号 2、采用合适的频…

Unity3D制作一个会移动的方块(还不会移动照相机)

学习Unity3D这么久了,如果你还不会制作一个按下WASD就可以移动的方块的话,那么你的学习将没有一点成就感,我学习的时候,我决定先学习移动,这样我就会对Unity更加感兴趣,学习起来的动力会更为充足 先创建一…

Nseeus安装及使用教程

Nessus是一款目前使用较多的系统漏洞扫描与分析软件 文章目录 Nessus下载安装使用启动:https://localhost:8834/ Nessus Nessus是一款目前使用较多的系统漏洞扫描与分析软件 下载 下载链接:https://www.tenable.com/downloads/nessus 安装 傻瓜式安装 使用 最…

Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭(C++)

Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭(C) Baumer工业相机Baumer工业相机NEOAPI SDK的技术背景Baumer工业相机使用NEOAPISDK控制相机数据流的方式1.引用合适的类文件2.使用NEOAPISDK控制相机数据流的方式2.使用…

Xshell 连接虚拟机Ubuntu系统失败解决方案

背景知识: Xshell 是一个强大的安全终端模拟软件,可以进行远程登录,它支持 SSH1, SSH2, 以及 Microsoft Windows 平台的 TELNET 协议。 xshell通过ip连接,所以需要知道虚拟机的IP地址 使用XShell的主要目的是在Windows环境下登…

leetcode111. 二叉树的最小深度(java)

二叉树的最小深度 leetcode111. 二叉树的最小深度题目描述 DFS 深度优先遍历解题思路代码演示 BFS 广度优先遍历解题思路代码演示 往期经典 leetcode111. 二叉树的最小深度 来源:力扣(LeetCode) 链接:https://leetcode.cn/problem…

基于立创EDA的原理图设计

目录 学习目标 一、开发中原理图的作用 1.1 原理图 1.2 产品开发原理图设计阶段 1.3 原理图中的具体工作内容 二、 立创EDA软件使用基础 2.1 立创EDA电路设计软件 2.2 新建工程 2.3 设计元件原理图封装 三、项目实战(单片机最小系统) 学习目标…

Kaggle 比赛总结:BirdCLEF 2023

赛题名称:BirdCLEF 2023赛题任务:识别音景中的鸟叫声赛题类型:语音识别 https://www.kaggle.com/competitions/birdclef-2023文章目录 一、比赛背景二、比赛任务三、评价方法四、优胜方案4.1 第一名4.2 第二名4.3 第三名4.4 第四名4.5 第五名…

SpringCloud Alibaba入门2之用户子模块开发

在上一章的基础上进行子模块的开发SpringCloud Alibaba入门之创建多模块工程_qinxun2008081的博客-CSDN博客 一、引入SpringBoot 我们在父项目统一管理引入的jar包的版本。我们采用父项目中以depencyMangement方式引入spring-boot,子项目依赖parent父配置即可。 &…

CTFshow-pwn入门-前置基础pwn29-pwn31

什么是PIE 由于ASLR是一种操作系统层面的技术,而二进制程序本身是不支持随机化加载的,便出现了一些绕过方法,例如ret2plt、GOT劫持、地址爆破等。于是,人们于2003年引入了位置无关可执行文件(Position-Independent Ex…

24. Vue防抖,禁止double click

Vue 防抖 如果按钮不做防抖限制,用户手滑或者其他场景大概率会出现重复调用接口的情况,比如编辑角色时,多次点击submit,会出现非预期请求。 为避免重复点击问题,可以加一个自定义组件将按钮禁用一段时间。 监听click时…

详解Java锁对象

1、Synchronized 1.1、synchronized特性 1、互斥 synchronized会起到互斥效果,某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象synchronized就会阻塞等待。 *进入synchronized修饰的代码块,就相当于加锁。 *退…

10.安装dashboard

有了之前我们部署的 keystone 、 glance 、 nova 、 neutron 服务之后,我们就可以启动云主机了,但是如果只是使用命令来操作OpenStack 的话非常不方便,我们使用OpenStack 搭建云平台就是为了把底层所有资源整合在一起,然后以一种方…

html5前端学习2

一篇思维题题解: 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/SIHdM 快捷键: CtrlAltDown 向下选取 CtrlAltUp 向上选取(会出现多个光标,可以同时输入) CtrlEnter …

linux 内核资源配置--cgroups详解以及在docker中的应用

一、Cgroup 概述 1.1、cgroups 是什么 Linux cgroup (Control Groups)是 Linux 内核提供的一种机制,用于限制进程组使用的资源(如 CPU、内存、磁盘 I/O 等)。通过将进程组划分为层次结构,并将资源限制应用…

【操作系统】2、进程与线程

【重要考点】 1. 进程与线程 进程与线程的基本概念 进程与线程的状态 转换 ——五态图,七态图 线程的实现: 内核级 用户级 进程与线程的组织和控制 进程间通信IPC: 共享内存、消息传递、管道 2.CPU调度与上下文切换 调度的基本概念 调度的实…

39.SpringCloud—配置管理nacos、远程调用Feign、服务网关Gateway

目录 一、SpringCloud。 (1)Nacos配置管理。 (1.1)统一配置管理。 (1.2)配置热更新(自动更新,不需要重启服务)。 (1.3)多环境配置共享。 &a…

【C++篇】初识C++

友情链接:C/C系列系统学习目录 知识点内容正确性以C Primer(中文版第五版)、C Primer Plus(中文版第六版)为标准,同时参考其它各类书籍、优质文章等,总结归纳出个人认为较有逻辑的整体框架&…

E. Tracking Segments - 二分+前缀和

分析&#xff1a; 记录所有区间和给定的每一次的询问&#xff0c;二分询问的最小满足条件&#xff0c;可以通过前缀和来计算区间内有几个1。 代码&#xff1a; #include <bits/stdc.h>#define x first #define y secondusing namespace std;typedef long long ll; type…