Redis 2023面试5题(二)

一、Redis key没设置过期时间却被redis主动删除了

如果一个 Redis 键没有设置过期时间,那么 Redis 无法判断该键是否应该自动删除。因此,如果一个没有设置过期时间的键被 Redis 主动删除了,可能是以下原因之一:

  1. 内存不足:如果 Redis 内存不足,它会删除一些键以释放内存。如果该键没有被设置过期时间,则可能会被作为“临时”键删除。
  2. 数据库空间不足:如果 Redis 数据库空间不足,它会删除一些键以释放空间。在这种情况下,可能会删除没有设置过期时间的键。
  3. 手动删除:可能是有人手动删除了该键。

可以通过以下方法来避免 Redis 主动删除没有设置过期时间的键:

  1. 设置键的过期时间为一个较长的值,例如 230000 年。这样可以避免 Redis 在键被使用之前将其删除。
  2. 在使用完键之后,手动删除它。这样 Redis 就不会在键被使用之前将其删除。如果你不再需要这个键,那么最好将其删除,以便释放内存。

需要注意的是,如果你设置了太多的键,而且这些键的过期时间很短,那么 Redis 的内存占用可能会迅速增加,从而导致性能下降或者宕机。因此,在设置键的过期时间时需要权衡好内存占用和性能之间的关系。

二、Redis有哪些淘汰key的策略

主动清理策略在Redis 4.0之前一共实现了 6 种内存淘汰策略,在 4.0 之后,又增加了 2 种策略,总共8种

a)针对设置了过期时间的key做处理:

  1. volatile-tl: 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除.
  2. volatile-random: 就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
  3. volatile-lru: 会使用 LRU 算法筛选设置了过期时间的键值对删除
  4. volatile-lfu: 会使用 LFU 算法筛选设置了过期时间的键值对删除。

b) 针对所有的key做处理:

  1. allkeys-random: 从所有键值对中随机选择并删除数据
  2. allkeys-lru: 使用 LRU 算法在所有数据中进行筛选删除
  3. allkeys-lfu: 使用 LFU 算法在所有数据中进行筛选删除

c) 不处理:

  1. noeviction: 不会别除任何数据,拒绝所有写入操作并返回客户端错误信息"eror) 00M command not allowed whenused memory”,此时Redis只响应读操作。

三、Redis淘汰key策略LRU与LFU的区别

  1. LRU(Least Recently Used):最近最少使用策略。当Key空间被占满时,淘汰最近最少使用的Key。

  2. LFU(Least Frequently Used):最不经常使用策略。当Key空间被占满时,淘汰最不经常使用的Key

LRU是按时间轴来淘汰数据,即淘汰最近最少使用的数据;LFU是按使用次数来淘汰数据,即淘汰最不经常使用的数据。

当内存空间不足时,Redis会根据淘汰策略来删除部分数据,以释放内存空间。可以在Redis的配置文件中配置淘汰策略的相关参数,如最大内存、淘汰策略的阈值等。

绝太多数情况下我们使用LRU策略,当存在大量热点缓存数据时,推荐使用LFU

补充说明:

在Redis中,LRU算法是通过一个叫做“过期字典”的机制来实现的。当一个key被设置了过期时间时,Redis会在过期时间到达后将其从内存中删除。如果一个key没有被设置过期时间,但是已经很久没有被访问了,那么Redis会将其标记为“过期”,并在下一次垃圾回收时将其删除 。

四、删除Key时会阻塞Redis吗?

在Redis中,删除Key的操作通常不会阻塞其他操作。这是因为Redis使用单线程模型,并且删除Key是一个原子性操作,不需要其他线程来协助完成。

然而,在某些情况下,删除Key可能会阻塞Redis。

  1. 例如,当你使用Redis作为数据库时,如果一个客户端正在读取数据库,并且另一个客户端正在删除一个Key,那么删除Key的操作可能会导致读取操作失败,因为Key已经不存在了。这种情况通常会在数据库中发生,因为数据库需要保持一致性。
  2. 如果删除的是Bigkey,里面的数据比较大,删除需要比较长的时间,可能会阻塞Redis。

总的来说,删除Key的操作在Redis中是一个相对较快的操作,不会阻塞其他操作。但是,在某些情况下,它可能会对其他操作产生影响,因此需要仔细考虑在使用Redis时如何处理删除Key的操作。

五、Redis主从、哨兵、集群架构优缺点比较

1. 主从架构

主节点负责处理所有的写请求,将数据写入到内存中,并将数据异步地同步给从节点。从节点负责处理读请求,从主节点同步数据,并在主节点挂掉后,顶替主节点继续提供服务。
在这里插入图片描述

Redis主从架构的好处:

  1. 提高数据的可用性:从节点可以处理读请求,当主节点挂掉时,可以从从节点读取数据,从而提高了数据的可用性。
  2. 备份数据:从节点会将数据同步到磁盘中,从而可以备份数据,提高数据的安全性。
  3. 分担负载:从节点可以分担主节点的负载,提高Redis的性能。
  4. 读写分离:通过读写分离,可以将读请求和写请求分发给不同的节点,从而提高Redis的读写效率。

Redis主从架构的缺点:

  1. 复制延迟:在Redis主从架构中,主节点需要将写操作复制到从节点中,这个过程需要一定的时间,可能导致数据复制延迟。这可能会影响数据的实时性和一致性。
  2. 性能下降:当从节点数量增加时,Redis主从架构的性能可能会下降。因为每个从节点都需要从主1. 节点获取数据,这会增加主节点的负载,从而影响整个集群的性能。
    故障转移风险:在Redis主从架构中,如果主节点出现故障,需要手动将一个从节点提升为主节点。这会导致一定的数据丢失风险,因为提升的从节点可能没有主节点最新的数据。
  3. 数据不一致性:在Redis主从架构中,如果主节点和从节点的数据存在不一致性,可能会导致数据错误。例如,当主节点和从节点的数据更新时间不同时,就可能出现这种情况。
  4. 运维难度:Redis主从架构的运维难度较大,需要专业的运维团队进行管理和维护。运维人员需要熟悉Redis的运行机制和主从架构的配置方式,以便及时处理故障和调整配置。

2. 哨兵架构

Redis 哨兵架构是一种 Redis 集群管理模式,用于监控 Redis 主节点和从节点的运行状态,并自动处理节点故障。
在这里插入图片描述

Redis 哨兵架构包括以下几个部分:

  • 哨兵进程(Sentinel):哨兵进程是 Redis 集群的监控器,会持续监控主节点和从节点的状态,如果发现主节点或从节点出现故障,哨兵进程会触发自动故障转移操作。
  • 主节点(Master):主节点是 Redis 集群中的写节点,负责处理所有的写请求。
  • 从节点(Slave):从节点是 Redis 集群中的读节点,负责处理读请求,并在主节点故障时,进行故障转移操作。
  • 故障转移(Failover):当主节点出现故障时,哨兵进程会通过选举操作选出一个从节点作为新的主节点,并将所有的写请求发送给新的主节点。
  • 重新同步(Resynchronization):当从节点出现故障时,哨兵进程会重新同步从节点和主节点之间的数据,以确保数据的一致性。

Redis 哨兵架构的好处:

  1. 监控节点状态:Redis 哨兵架构可以持续监控节点的状态,及时发现和处理节点故障。
  2. 自动故障转移:当主节点出现故障时,Redis 哨兵架构可以自动选出新的主节点,并将所有的写请求发送给新的主节点,从而提高了数据的可用性和可靠性。
  3. 数据备份:从节点可以将数据同步到磁盘中,从而备份数据,提高数据的安全性。
  4. 分担负载:从节点可以分担主节点的负载,提高 Redis 的性能。
  5. 读写分离:通过读写分离,可以将读请求和写请求分发给不同的节点,从而提高 Redis 的读写效率。

Redis 哨兵架构的缺点:

  1. 监控开销:Redis 哨兵架构需要持续监控主节点和从节点的状态,这会增加一定的监控开销,导致哨兵进程可能会成为整个集群的性能瓶颈。
  2. 配置复杂:Redis 哨兵架构的配置比较复杂,需要配置多个文件,并且需要保证配置的一致性。如果配置不当,可能会导致哨兵进程无法正确监控节点状态,从而导致故障转移失败。
  3. 故障转移时间:当主节点出现故障时,Redis 哨兵架构需要进行故障转移操作,选择一个新的从节点作为新的主节点。这个过程需要一定的时间,可能会导致一段时间内 Redis 集群无法处理写请求。
  4. 数据不一致性:当从节点出现故障时,Redis 哨兵架构需要进行重新同步操作,将主节点和从节点之间的数据同步到新的从节点上。如果重新同步操作不成功,可能会导致数据不一致性。
  5. 运维难度:Redis 哨兵架构的运维难度较大,需要专业的运维团队进行管理和维护。运维人员需要熟悉 Redis 的运行机制和哨兵模式的配置方式,以便及时处理故障和调整配置。

3. Redis集群架构

Redis集群架构是为了提高Redis数据的可用性和可靠性的一种架构模式。Redis集群架构通常包括多个节点,这些节点组成了一个分布式的存储系统,可以对外提供读写服务。
在这里插入图片描述

Redis集群架构有两种方案:

  • 带有主从结构的集群架构:这种架构包含一个主节点和多个从节点。主节点负责处理所有的写请求,并将写请求同步给从节点。从节点只负责处理读请求,并在主节点挂掉时,进行故障转移操作。
  • 不带有主从结构的集群架构:这种架构中,所有节点都是平等的,都可以处理读请求和写请求。这种架构通常需要使用一些分片机制,将数据分散到不同的节点上,以实现数据的分布式存储。

在Redis集群架构中,数据的读写流程如下:

  1. 客户端向集群中任意一个节点发送一个读请求。
  2. 接收到请求的节点会检查自己是否拥有该数据,如果拥有,则直接返回数据;如果不拥有,则将请求转发给拥有该数据的节点。
  3. 客户端向集群中任意一个节点发送一个写请求。
  4. 接收到请求的节点会检查自己是否拥有该数据,如果拥有,则直接执行写操作;如果不拥有,则将请求转发给拥有该数据的节点。

Redis集群架构的好处:

  1. 提高数据的可用性和可靠性:多个节点可以互相备份,当某个节点挂掉时,可以从其他节点读取数据,从而提高了数据的可用性和可靠性。
  2. 分担负载:多个节点可以分担主节点的负载,提高 Redis 的性能。
  3. 读写分离:通过读写分离,可以将读请求和写请求分发给不同的节点,从而提高 Redis 的读写效率。

Redis集群架构的缺点:

  1. 节点故障:当集群中某个节点出现故障时,会导致该节点上的数据无法访问。虽然可以通过数据备份和故障转移等方式来减少数据丢失的风险,但是故障转移操作可能会导致一定的数据不一致性。
  2. 性能限制:Redis 集群架构的性能受到节点数量和节点处理能力的限制。当集群规模较大时,性能可能会受到影响,而且大规模的集群管理也可能会变得复杂。
  3. 数据分片:在带有分片机制的 Redis 集群架构中,数据需要被均匀地分配到各个节点上。但是如果数据分配不均匀,可能会导致某些节点的负载过高,从而影响整个集群的性能。
  4. 运维难度:Redis 集群架构的运维难度较大,需要专业的运维团队进行管理和维护。
  5. 成本增加:Redis 集群架构需要更多的节点和服务器,从而增加了硬件成本和运维成本。

总结:

Redis 的主从、哨兵、集群模式都是为了实现高可用和高并发,但它们之间有以下区别:

  • 主从模式:主从模式是最简单的实现高可用的方案,核心就是主从同步。主服务器负责处理所有客户端请求,并将请求产生的数据变化发送给从服务器,从服务器负责接收主服务器的数据变化并保持与主服务器的数据一致性。主从模式可以提供读写分离、故障恢复和容错等功能,但当主服务器出现故障时,需要手动切换到从服务器,切换过程可能导致短暂的服务中断。
  • 哨兵模式:哨兵模式是 Redis 的一种高可用方案,通过哨兵节点来监控主服务器和从服务器的状态,并在主服务器出现故障时自动将从服务器转换为主服务器。哨兵模式可以自动实现故障转移和恢复,以及监控和通知等功能,但由于每个哨兵节点都需要与所有 Redis 实例进行通信,因此对网络带宽和延迟要求较高。
  • 集群模式:集群模式是 Redis 的一种分布式数据存储方案,可以将数据分散存储在多个 Redis 实例中,并提供数据分片、复制和故障转移等功能。集群模式可以提供高并发和海量数据存储的能力,但需要对数据进行分片和路由等处理,且需要保证数据的一致性和可靠性。

综上所述,主从模式适用于读写分离、故障恢复和容错等场景,哨兵模式适用于高可用和自动故障转移等场景,集群模式适用于分布式存储和高并发等场景。在实际应用中,可以根据具体需求选择合适的模式或组合使用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文笔记】BEIT:BERT PRE-TRAINING OF IMAGE TRANSFORMERS

GitHub 1.介绍 1.1 挑战 视觉转换器的输入单元,即图像补丁,没有预先存在的词汇。预测遮罩面片的原始像素往往会在预训练短程依赖性和高频细节上浪费建模能力 1.2 回顾一下Bert的基本架构和流程 输入编码:通过tokenizer将输入的文本中的每…

OceanBase—01(入门篇——使用docker安装OceanBase以及介绍连接OB的几种方式)

OceanBase—01(入门篇——使用docker安装OceanBase以及介绍连接OB的几种方式) 1. 前言1.1 安装部署参考1.1.1 安装前提1.1.2 参考 1.1 修改数据库用户名密码1.2 总结常见连接命令 2. 安装部署OceanBase2.1 启动 OceanBase 数据库实例2.1.1 拉取镜像并启动…

eclipse (C/C++) 常用设置记录

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台;现公司用其作为开发单片机的IDE;因此记录一下常用的配置方法; 文章目录 零、常用默认快捷键一、高亮相同变量二、修改高亮变量颜色三、在整个工程内搜索某个函数四、切换主题五、改变字…

编译原理笔记16:自下而上语法分析(3)构造 DFA、DFA 对下一步分析的指导(有效项目)

目录 由 NFA 用子集法构造 DFA由 LR(0) 项目直接构造识别活前缀的 DFA构造 DFA求拓广文法 GCLOSURE & GO例: 构造 DFA DFA 指导下一步分析有效项目 看了前面的内容,我们已经了解到:分析表和驱动器算法,是 LR 分析器的核心。 …

基于Java+Swing+Mysql实现图书管理系统V2.0

基于JavaSwingMysql实现图书管理系统V2.0 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库表4.主界面5.添加6、修改7、查询8、删除 四、其它1.其他系统实现五.获取源码 一、系统介绍 本系统主要有对图书信息的增删改查操作功能。 项目类型:Java SE项目&…

linux 下查看 USB 设备

文章目录 前言目录内容详解usb11-0:1.01-1.1:1.0 结构图设备信息bDeviceClassversionbusnum & devnumdevbMaxPoweridVendor & idProductproductmanufacturerbcdDevicespeedueventbmAttributesdrivers_autoprobe 前言 在 sysfs 文件系统下,查看 USB 设备&am…

Android 9-SystemUI:(1)启动流程

具体分析(以下代码示例,讲解,都是通过,Android9代码来举例) SystemUI,其实是可以看作是一个系统级的服务,也就是SystemUIService, SystemUI的服务启动,要从SystemServer.run()方法入手 main 方法里启动了…

企业级微服务架构实战项目--xx优选3-mq+nacos+es实现上下架

一 nacosmqes实现上下架 1.1 架构图 1.2 工程结构 1.3 核心代码流程 1.3.1 请求product模块 2.修改数据库,推送rabbitmq中 1.3.2 rabbitmq的工具类 1.3.3 search模块中rabbit客户端订阅信息 1.监听器监听信息 2.调用相应的上下架方法 2.1 调用product模块&…

Flink 学习三 Flink 流 process function API

Flink 学习三 Flink 流&process function API 1.Flink 多流操作 1.1.split 分流 (deprecated) 把一个数据流根据数据分成多个数据流 1.2 版本后移除 1.2.分流操作 (使用侧流输出) public class _02_SplitStream {public static void main(String[] args) throws Excep…

uniapp设置滚动条滚动到指定位置

场景:左侧菜单栏,每次切换时,需要右侧商品展示区保持滚动条及页面在最顶部 1.利用scroll-view 中scroll-top属性实现 1.1设置scrollToTop属性为0 data() {return {// 保证每次切换,滚动条位置都在最顶部scrollToTop: 0,}; } 1.…

ansible的剧本(playbook)

一、playbooks 概述以及实例操作 1、playbooks 的组成 playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 (2)Variables&#xff1…

iOS 单元测试之常用框架 OCMock 详解 | 京东云技术团队

一、单元测试 1.1 单元测试的必要性 测试驱动开发并不是一个很新鲜的概念了。在日常开发中,很多时候需要测试,但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西。测试的时候,往往是用模拟器一次一次的从头开始启动 app&a…

团体程序设计天梯赛-练习集L2篇④

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

模糊聚类在负荷实测建模中的应用(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

VSCode使用CodeWhisperer(AI编程)

安装AWS Toolkit插件,点击侧边插件搜索并安装 2.点击aws ->CodeWhisperer ->Start 3.在下拉菜单中点击Use a personal email to sign up and sign in with AWS Builder ID 4.点Copy Code and Proceed,这会自动复制一些东西 5. 收到提示打开外部网…

【跑实验05】利用CLIP中的图像编码器,如何遍历文件夹中的图像,将图像文件改为28*28的尺寸,然后输出到excel中的每一列,最后一列全都标记为0

文章目录 一、初步实现二、警告信息的解决三、Excel的限制四、尝试解决 一、初步实现 要遍历文件夹中的图像并将其尺寸调整为28x28,并将结果输出到Excel中,可以按照以下步骤进行操作: 首先,确保您已经安装了Pandas库&#xff0c…

“插入排序:小数据量排序的王者“

文章目录 🔍什么是插入排序?🔑插入排序的优缺点🚀实现插入排序 🔍什么是插入排序? 插入排序是一种简单的排序算法,它的基本思想是:将待排序的元素,从第二个元素开始&…

Adobe Creative Cloud 摄影计划 - 当图像与想象力相遇。 PS+LRc套餐 国际版 1年订阅/398

这里重点介绍国际版摄影计划套餐详情: 国际版包括:Photoshop、Lightroom Classic、Photoshop Express、Lightroom Mobile、Lightroom、云服务。中国版包括:Photoshop、Lightroom Classic、Photoshop Express、Lightroom Mobile 桌面应用程序…

力扣高频SQL50题(基础版)——第十天

力扣高频SQL50题(基础版)——第十天 1 只出现过一次的最大数字 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出1 1.1.3 示例输入输出2 1.2 示例sql语句 # 查不到时的结果自然就为Null SELECT MAX(t.num) num FROM (SELECT numFROM MyNumbersGROUP By numHAVING count…

2023考研一战上岸 电子科技大学 860软件工程 经验分享

目录 1. 前言:考研,心态最重要! 2. 初试各科复习经验 (1) 数学一 (2) 英语一 (3) 专业课 (4) 政治 (5) 四门课时间划分 3. 复试流程和备考建议 (1) 复试流程 (2) 备考建议 4. 结语 首先,先简要做一个自我介绍&#xff…