关于Redis的面试题(一)

devtools/2024/9/24 4:36:01/

一、为什么要使用Redis

  1. 内存数据库,速度很快
  2. 工作单线程worker,串行化,原子操作,IO线程是多线程的。避免上下文切换
  3. 使用 IO模型,天生支撑高并发
  4. kv模型,v具有类型结构
  5. 具有本地方法,计算数据移动
  6. 二进制安全,value值最大为512MB

二、Redis是多线程还是单线程

Redis在6.0版本之前是单线程的,到了6.0版本后,IO流是一个线程池,是多线程的,但工作线程依旧是单线程。

三、Redis持久化方法

Redis是一个内存数据库,当遇到突然断电或者服务器崩溃时,里面的数据就会全部丢失,这时就需要Redis持久化。
Redis持久化的工作机制就是将数据保存到磁盘中,利用永久性存储介质来保存数据,在特定时间将保存的数据进行恢复
有两种方法可以实现:

  1. AOF:存储操作过程,关注点在数据的操作过程
  2. RDB:存储数据结果,关注点在数据
    在这里插入图片描述

3.1、Redis持久化的两个方法

3.1.1 RDB

在指定的时间间隔内将内存中的数据集中写进磁盘中,也就是快照文件,数据恢复就是将快照文件读到内存中。

Redis会利用fork函数创建一个子线程进行持久化,会先将数据写入到一个临时文件中,等持久化过程结束后,将临时文件替换上次持久化的文件。

fork函数的作用就是复制一个当前线程作为当前线程的子线程,子线程与当前线程的所有数据数值一致。请添加图片描述
RDB的优缺点
缺点:

  1. 快照时间有间隔,不能实时备份,丢失数据可能会很多
  2. 在数据集比较庞大时,开启子线程备份数据,fork()运行会非常耗时,服务器会在一定时间内停止处理客户端。

优点:

  1. 恢复数据的速度快
  2. 备份的文件就是原始文件的内存大小,不会额外占用内存空间

RDB的触发方式

  • 手动触发:通过书写命令触发
  • 自动触发:通过配置参数设置自动触发

3.1.2 AOF

会将客户端的写操作以日志的形式追加到appendonly.aof文件末尾,在Redis服务器重启后,加载aof文件中的所有命令,用来恢复数据。
请添加图片描述
AOF的优缺点
缺点:

  • 生成的文件体积较大
  • 数据恢复速度较RDB更慢

优点:

  • 数据安全性较高,不容易丢失数据
  • AOF文件有序保存所有写操作,可读性较高

AOF的触发方式

  • 手动触发:通过bgrewriteaof命令:重写AOF持久化生成aof文件
  • 自动触发:redis默认没有开启AOF。需要通过配置文件开启

四、Redis结构体

请添加图片描述

安装docker

docker run -d -p 6379:6379  --name redis01 redis:7.2.4

请添加图片描述以上命令,每次启动新的Redis容器,数据会丢失。

我们需要挂载数据文件,在宿主机上面,这样就可以持久化数据.

docker run -p 6379:6379 -d --name redis01 --restart=always 
-v /opt/redis/redis.conf:/etc/redis.conf 
-v /opt/redis/data:/data 
redis:7.4.0 redis-server /etc/redis.conf

//如果拉不下来请使用m.daocloud.io/docker.io/redis:7.4.0

五、在百万keys的Redis中,如何模糊查询某一个key?

典型回答

通常是使用 KEYS 命令或 SCAN命令配合模式匹配,但是KEYS命令在数据量较大时,可能会导致性能问题,因为它会阻塞服务器并消耗大量资源,因此在生产环境中,推荐使用SCAN命令使用类似的功能。

SCAN是一个基于游标的迭代器,SCAN在每次被调用之后,都会向用户返回一个新的游标,用户在下一次迭代时需要使用这个游标作为SCAN命令的游标参数,来延续迭代过程。当游标设置为0时,开始第一次迭代,当返回的游标为0时,表示迭代结束。SCAN返回的是一个包含两个元素的数组,第一个元素是用于下次迭代的游标,第二个元素是一个包含所有被迭代的元素,元素的数量由迭代器决定。


http://www.ppmy.cn/devtools/91846.html

相关文章

FFmpeg源码:av_init_packet、get_packet_defaults、av_packet_alloc函数分析

一、av_init_packet函数 av_init_packet函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的源文件libavcodec/avpacket.c中: /*** Initialize optional fields of a packet with default values.** Note, this does not touch the…

Python实现深度森林(Deep Forest)分类模型(deepforest分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着大数据时代的到来,机器学习技术在各个领域的应用变得越来越广泛。在许多实际问题中&am…

Java养老护理帮忙代办陪诊陪护小程序系统源码

🌸【贴心守护,养老新选择】养老护理、代办陪诊、陪护小程序全攻略👩‍⚕️👨‍👩‍👧‍👦 🌈 引言:科技温暖夕阳红 在这个快节奏的时代,如何让家中长辈享受…

解决Pytest UnknownMarkWarning: Unknown pytest.mark.single - is this a typo?

解决 Pytest UnknownMarkWarning: Unknown pytest.mark.single - is this a typo? 出现截图所示问题 前提: 1.项目中使用了mark标记: pytest.mark.single2.同时项目中包含pytest.ini文件并进行了pytest.ini配置 运行项目 运行时报出截图所示Warning …

java springboot mqtt控制海康摄像头

GHHKControlService 接口 package org.gh.ghhk.service;public interface GHHKControlService {boolean monitorControl(String payload);}GHHKControlServiceImpl 实现类 ​ package org.gh.ghhk.service.impl;import com.alibaba.fastjson.JSONArray; import com.alibaba.…

Jenkins 部署Vue项目指引: Vue项目本地跨域代理 、解决ERR_UNSAFE_PORT

文章目录 引言I Jenkins 部署Vue项目配置插件安装系统配置NodeJS安装目录和别名设置新建任务(通用类型)构建环境Build Steps(构建步骤)II nginx部署站点(端口和站点目录的映射)查找Nginx配置文件端口和站点目录的映射III Vue项目本地跨域代理,屏蔽掉后端服务API的网关IP…

编程-设计模式 5:原型模式

设计模式 5:原型模式 定义与目的 定义:原型模式通过复制现有的实例来创建新对象,而不是通过构造函数创建。目的:这种模式的主要目的是为了提高创建对象的性能,特别是在创建对象的成本较高时。通过克隆现有的实例&…

stm32 gpio

点灯 /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin(GPIOC,LED0_Pin,GPIO_PIN_RESET);//点亮 LED0是在引脚定义的时候UserLabel的内容 _Pin需要加上 HAL_Delay(5000); HAL_GPIO_WritePin(GPIOC,LED0_Pin,GPIO_PIN_SET);//熄灭 HAL…