redis核心面试题一(架构原理+RDB+AOF)

文章目录

  • 0. redis与mysql区别
  • 1. redis是单线程架构还是多线程架构
  • 2. redis单线程为什么这么快
  • 3. redis过期key删除策略
  • 4. redis主从复制架构原理
  • 5. redis哨兵模式架构原理
  • 6. redis高可用集群架构原理
  • 7. redis持久化之RDB
  • 8. redis持久化之AOF
  • 9. redis持久化之混合持久化

0. redis与mysql区别

1.数据库类型
	MySQL是关系型数据库
	Redis是缓存数据库(非关系型数据库)
2.数据存放位置
	MySQL:数据存放在磁盘中
	Redis:数据存放在内存中
3.支持数据类型
	MySQL:数值、日期/时间、字符串
	Redis:String、Hash、List、Set、Zset

1. redis是单线程架构还是多线程架构

redis6.0版本之前是单线程,这里的单线程指的是网络IO和键值对读写命令是由一个线程完成的
redis6.0版本之前之后是多线程,这里的多线程指的是在网络IO请求过程中采用了多线程,但是键值对读写命令仍然是单线程的,并且持久化、集群数据同步、异步删除都是由额外的线程完成的。

所以redis仍然是线程安全的

2. redis单线程为什么这么快

  1. 命令执行基于内存操作,单条命令操作时间是几十纳秒

  2. 命令执行是单线程操作,避免了多线程上下文切换开销

  3. 高效的数据结构,包括全局Hash表、简单动态字符串、双向链表、跳跃表、整数数组

  4. 基于IO多路复用技术,能够保证大量并发下的效率,提高系统的吞吐量

在这里插入图片描述

3. redis过期key删除策略

1.惰性删除:	key达到过期时间,不会被立即删除,只有当读写到这个已经过期的key时,才会触发惰性删除策略删除该key

2.定时删除:	由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期(默认每100ms)主动淘汰一批已过期的key,这里的一批只是部分过期key,所以可能会出现部分key已经过期但仍然还没有被清理掉的情况

3.主动删除:	当redis已用内存超过maxmemory限定时,触发主动清理策略,共8种内存淘汰策略
a)针对设置了过期时间的key
	1. volatile-ttl:	在设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
	2. volatile-random:	在设置了过期时间的键值对,进行随机删除。
	3. volatile-lru:	会使用LRU算法筛选设置了过期时间的键值对删除。
	4. volatile-lfu:	会使用LFU算法筛选设置了过期时间的键值对删除。

b)针对所有的key
	5. allkeys-random:	从所有键值对中随机选择并删除数据。
	6. allkeys-lru:		使用LRU算法在所有数据中进行筛选删除。
	7. allkys-lfu:		使用LFU算法在所有数据中进行筛选删除。

c)不处理
 	8. noeviction:不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息,此时Redis只响应读操作。
    
LRU算法(Least Recently Used,最近最久未使用):		 淘汰很久没被访问过的数据,以最近-次访问时间作为参考
LFU算法(Least Frequently Used,最不经常使用):		淘汰最近一段时间被访问次数最少的数据,以次数作为参考
绝大多数情况我们都可以用LRU策略,当存在大量的热点缓存数据时,LFU可能更好点

4. redis主从复制架构原理

常见的主从复制架构:总体来说,主数据库Master以写为主,从数据库Slave以读为主,整体负责读写分离、容灾恢复。

case1:一主二仆【中心化架构】 slaveof 新主库IP 新主库端口

case2:薪火相传【去中心化架构】 slaveof 新主库IP 新主库端口

case3:反客为主 slaveof no one

// 主从数据库数据同步过程
1.全量复制:【当主从服务器刚建立连接的时候,进行全量数据同步】
	a、首先从服务器连接到主服务器,发送psync命令进行数据全量同步(Redis2.8之前是sync命令)
	b、主服务器收到psync命令之后,执行bgsave命令生成RDB快照文件发送给从服务器
	c、从服务器收到RDB快照文件后,清空内存旧数据,将接收到的数据写入磁盘

2、增量复制:【全量复制结束后,进行增量复制】
	a、主服务器每执行一个写命令就会向从服务器发送相同的写命令
	b、从服务器接收并执行收到的写命令。

优点:
  (1)数据热备份:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  (2)故障恢复:	如果master宕掉了,哨兵模式可以提升一个新的master,实现故障转移,达到高可用。
  (3)负载均衡:	可以轻易实现横向扩展,实现读写分离,一个master用于写,多个slave 用于分摊读的压力
  
缺点:
  (1)网络延迟:由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave服务器有一定的延迟
  (2)如果master宕掉了,普通主从模式无法自动切换master,必须使用哨兵模式

5. redis哨兵模式架构原理

优点:可以动态切换主从库,中心型公司首选

缺点:

  1. 单个master主节点提供写服务,redis存储的数据有限(<10G),并发量不足(<3w)
  2. 自动切换主从库会产生访问瞬断的情况,切换没有那么快

在这里插入图片描述

工作原理:

	哨兵是一个分布式系统,可以在一个架构中运行多个哨兵进程,这些进程使用流言协议(gossip protocols)来传播Master是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移以及选择哪个Slave作为新的Master。哨兵模式的简单工作原理如下:
(1)监控:哨兵会不断地检查你的MasterSlave是否运作正常。
(2)提醒:当被监控的某个Redis节点出现问题时,哨兵可以通过 API 向管理员或者其他应用程序发送通知。
(3)自动故障迁移:当Master不能正常工作时,哨兵会进行自动故障迁移操作,将其中一个Slave升级为新的Master  

6. redis高可用集群架构原理

  1. redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片存储特性

  2. redis集群将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,可线性扩展到上万个节点(官方推荐不超过1000个节点)

  3. redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单。

    大型公司首选

在这里插入图片描述

7. redis持久化之RDB

RDB(Redis DataBase)在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时将快照文件 (dump.rdb) 移动到redis安装目录并启动服务即可。

save 3600 1		# 15分钟变动1次
save 300 100	# 5分钟变动100次
save 60 10000	# 1分钟变动1w次

save				save时只管保存,其它不管,全部阻塞。
bgsave			Redis会在后台异步进行快照操作, 快照同时还可以响应客户端请求。

在这里插入图片描述

RDB优点:
	1、持久化速度快:RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他I0操作,所以RDB持久化方式可以最大化redis的性能。[适合大规模的数据持久化]
  2、恢复速度快:与AOF相比,RDB是一个非常紧凑的文件,RDB数据恢复会更快一些
  
RDB缺点:
	1、内存膨胀:Fork的作用是复制一个与当前进程一样的进程,新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,大致2倍的膨胀性需要考虑。
	2、数据丢失:在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改

8. redis持久化之AOF

AOF(Append Only File)是以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

AOF配置【APPEND ONLY MODE】
appendonly no  										# 默认no
appendfilename "appendonly.aof" 	# 文件名
appendfsync [always/everysec/no]
  always		同步持久化,redis每次发生数据改变都会被立即记录到磁盘,性能较差但数据完整性最好
  everysec		默认推荐,异步操作,每秒记录一次,最多损失1s的数据
  no			不进行持久化
no-appendfsync-on-rewrite no 				# 重写时是否运用appendfsync,默认no即可,保证数据安全性
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
AOF优点:
  每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好
  每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
  不同步:appendfsync no 从不同步
  
AOF缺点:
	1、文件大、恢复慢:相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
  2Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

在这里插入图片描述

redis默认使用AOF恢复数据,因为aof保存的数据更全面

9. redis持久化之混合持久化

背景:

  1. 重启Redis时,我们很少只使用RDB来恢复内存数据,因为这会丢失大量数据
  2. 通常使用AOF日志重放来恢复数据,但是重放AOF日志性能相对RDB来说要慢很多,当Redis数据很大,启动需要花费很长的时间
    Redis 4.0为了解决这个问题,带来了一个新的持久化选项一混合持久化
实现步骤:
步骤一:通过如下配置可以开启混合持久化(必须先开启aof):
	aof-use-rdb-preamble yes

步骤二:此时AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB
快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件

步骤三:新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。

步骤四:redis重启的时候,可以先加载RDB的内容,然后再重放增量AOF日志就可以完全替代之前的AOF全量文件重放,因此重启效率大幅得到提升。

在这里插入图片描述

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

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

相关文章

【linux-uboot移植-mmc及tftp启动-IMX6ULL】

目录 1. uboot简介2. 移植前的基本介绍&#xff1a;2.1 环境系统信息: 3. 初次编译4. 烧录编译的u-boot4.1 修改网络驱动 5. 通过命令启动linux内核5.1 通过命令手动启动mmc中的linux内核5.1.1 fatls mmc 1:15.1.2 fatload mmc 1:1 0x80800000 zImage5.1.3 fatload mmc 1:1 0x8…

VMware 安装Windows 7 SP1

1.下载镜像 迅雷&#xff1a;ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/ 2.安装过程 自定义名字&#xff0c;点击【浏览】自定义安装路径 点击【浏览】&#xff0c;选择下载镜像的路径 结束啦~ Win…

Pytorch深度学习实践笔记4

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 1 反向传播 Back propaga…

力扣Hot100-73矩阵置零(标记数组)

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入&…

2024年二建准考证打印入口已开通!

24年二建将于6月1日、2日举行&#xff0c;目前西藏、陕西准考证打印入口已开通&#xff0c;各省也将陆续开始准考证打印工作。 2024二建考试时间安排 2024二建准考证打印时间 二建准考证打印须知 01 准考证打印信息显示空白怎么办? 1)使用电脑自带的浏览器重新试一下。 2)…

【话题】你眼中的IT行业现状与未来趋势

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 引言一、IT行业的现状1.1 云计算与大数据1.2 人工智能与机器学习1.3 物联网与5G通信1.4 区块链技术 二、IT行业未来发展趋势2.1 边缘计算与智能设备2.2 深度学习与自然语…

话题:如何让大模型变得更聪明?

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;大模型&#xff08;如GPT-4、BERT、Transformer等&#xff09;在自然语言处理、图像识别和语音识别等领域取得了显著成果。然而&#xff0c;如何让大模型变得更聪明&#xff0c;进一步提升其性能和应用效果&a…

做好商业分析,帮你用有限的资源选择高效益项目实现战略目标

对于组织来说&#xff0c;资源条件总是有限的&#xff0c;为了实现战略目标&#xff0c;则需要从众多项目中筛选出最合适的项目来实现收益。但项目的筛选往往会遇到很多难点&#xff0c;如信息收集不全影响筛选的准确性、评估标准不明确或难以量化、决策过程复杂等等。 那么如何…

守护者:ThingsBoard物联网网关在温室环境监测中的应用

系统设计 智慧农业温室大棚系统由传感器及执行设备、数据传输网关、智慧农业温室大棚管理平台组成。 系统支持实时采集温室大棚内的空气温湿度、土壤温湿度、光照和二氧化碳等环境参数&#xff0c;根据农作物的生长需求自动控制温室中电器设备的启停&#xff0c;从而达到植物生…

caffe在ARM鲲鹏920-openEuler2309上的环境搭建

caffe 配置环境 caffe cpu-only openblas protobuf 编译caffe需要3.6~3.10版本&#xff0c;否则会报错 dnf install只能安装3.19版本 需要从源码编译&#xff0c;这里选择了3.9版本 protobuf的github仓 从源码编译安装 caffe-gpu mode caffe的gpu模式需要用到cuda make…

jmeter线程组(下篇)

线程组 线程组作为JMeter测试计划的核心组件之一&#xff0c;对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口&#xff0c;所有的取样器和控制器必须放置在线程组下。 可以将线程组视为一个虚拟用户池&#xff0c;其中每个线程可被理解为一个虚拟用户&#x…

【Django】从零开始学Django(持续更新中)

pip install Djangopython manage.py startapp index运行&#xff1a; 成功&#xff01;&#xff01;&#xff01; 在templates中新建index.html文件&#xff1a;

在做题中学习(61):连续数组

525. 连续数组 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;前缀和 哈希表 转化&#xff1a;将 0 ——> -1 转变为&#xff1a;找到和为0的最长子数组 细节&#xff1a; 1.哈希表存什么 前缀和 &#xff0c; 长度 2.什么时候存入哈希表 先处理前一个&…

【Crypto】password

文章目录 password解题感悟 password 试试flag{zs19900315} 提交成功 解题感悟 这题有点大病

工具分享:VsCode注释神器,koro1FileHeader

他是有官方Wiki的。 https://github.com/OBKoro1/koro1FileHeader/wiki/ 项目在GitHub上开源。以下摘录部分wiki&#xff0c;用作介绍分享在这里插入代码片 如何找到setting.json设置模板 简单的输入命令 打开VSCode命令面板: mac: command p window: ctrl p输入> Ope…

day15|各种遍历的应用

相关题目&#xff1a; 层次遍历会一打十 反转二叉树 对称二叉树 层次遍历会一打十 自底向上的层序遍历 实现思路&#xff1a;层次遍历二叉树&#xff0c;将遍历后的结果revers即可 public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List&l…

ubuntu22部署Docker私有仓库Harbor (http https方式)

harbor日志&#xff1a;/var/log/harbor 前置安装配置 需先安装docker和docker-compose&#xff1a; 0.配置清华大学apt源并安装docker #信任 Docker 的 GPG 公钥: sudo apt-get install ca-certificates curl gnupg curl -fsSL https://download.docker.com/linux/ubunt…

Talkingdata 数据统计

TalkingData 是一家提供移动大数据服务的平台&#xff0c;专注于为客户提供全面的产品统计分析服务和权威的移动行业数据解析。通过集成 TalkingData 的 SDK&#xff0c;开发者可以收集、处理和分析其应用的一方数据&#xff0c;从而深入了解用户的使用行为、应用表现及市场动态…

Java面试八股之什么是死锁

什么是死锁 死锁&#xff08;Deadlock&#xff09;是多线程编程中的一种常见问题&#xff0c;特别是在涉及到资源共享和同步的时候。具体来说&#xff0c;死锁是指两个或两个以上的线程在执行过程中&#xff0c;由于互相持有并等待对方释放的资源&#xff0c;而导致所有线程都…

IP地址显示“不安全”怎么办|已解决

解决IP地址显示“不安全”的问题&#xff0c;通常需要确保网站或服务使用HTTPS协议进行加密通信&#xff0c;可以通过部署SSL证书来解决&#xff0c;以下是具体的解决步骤&#xff1a; 1 申请IP地址SSL证书&#xff1a;网站管理员应向证书颁发机构&#xff08;CA&#xff09;申…