Redis 2023面试5题(一)

news2024/10/6 2:22:27

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

在面试中,当被问到Redis是单线程还是多线程这个问题时,可以按照以下思路进行回答:

  1. 首先,Redis的核心业务部分是单线程的,即命令处理部分是单线程的。
  2. 然而,Redis也支持多路复用技术,例如使用多线程来处理多个客户端请求,以便提高并发性能。
  3. 在Redis的版本迭代过程中,引入了多线程异步处理一些耗时较旧的任务,例如异步删除命令unlink,以及在核心网络模型中引入多线程,进一步提高对于多核CPU的利用率。
  4. 总的来说,Redis在核心业务部分是单线程的,但是在辅助任务和处理多个客户端请求时使用了多线程。这主要是为了提高Redis的性能和可伸缩性。

补充说明:

  • Redis 6.0版本之前的单线程指的是其网络I/O和键值对读写是由一个线程完成的,
  • Redis6.0引入的多线程指的是网络请求过程采用了多线程,而键值对读写命令仍然是单线程处理的,所以Redis依然是并发安全的
  • 也就是只有网络请求模块和数据操作模块是单线程的,而其它的持久化、集群数据同步等,其实是由额外的线程执行的

二、Redis6.0与之前版本有什么不同

Redis6.0相较于之前的版本主要有以下改进:

  1. 支持模块系统:Redis6.0引入了模块系统,可以动态加载模块,使得Redis可以支持更多的数据类型和功能。
  2. 支持Lua脚本:Redis6.0引入了Lua脚本语言,可以用于实现更复杂的业务逻辑。
  3. 支持自动分区:Redis6.0引入了自动分区功能,可以将数据自动分布在多个Redis实例之间,提高可伸缩性和可靠性。
  4. 支持集群:Redis6.0引入了集群功能,可以支持分布式存储和负载均衡,提高Redis的并发性能和可靠性。
  5. 支持SSL连接:Redis6.0支持SSL连接,可以提供更加安全的数据传输保障。
  6. 优化性能:Redis6.0对性能进行了优化,可以提高Redis的读写效率和稳定性。
  7. 改进RDB和AOF格式:Redis6.0对RDB和AOF格式进行了改进,可以提高数据恢复的速度和完整性。

总之,Redis6.0相较于之前的版本在功能、性能、安全性和可伸缩性等方面都有所改进和提升。

三、Redis单线程为什么还这么快

Redis之所以能够以单线程的方式运行得如此快速,主要有以下几个原因:

  1. 纯内存操作:Redis的所有数据都存储在内存中,避免了硬盘读写和网络传输等耗时的操作,因此能够快速地处理请求。
  2. 高效的数据结构:Redis的数据结构是专门设计的,例如Hash和Set等数据结构都是在内存中以数组的方式存储,使得查找和操作都非常高效。
  3. 单线程优势:由于Redis是单线程的,因此不需要进行线程切换和锁竞争等操作,避免了这些耗时的操作对性能的影响。
  4. 非阻塞IO模型:Redis使用了非阻塞IO模型,使得其在处理客户端请求时不会阻塞其他操作的执行,从而提高了Redis的并发性能。

综上所述,Redis能够以单线程的方式运行得如此快速,主要是因为其纯内存操作、高效的数据结构、单线程优势和非阻塞IO模型等因素的综合作用。

四、Redis底层是如何使用跳表来存储的

Redis的底层使用跳表(SkipList)来存储数据,跳表是一种基于链表的数据结构,可以在链表的基础上增加多级索引,从而提高查询效率。Redis的跳表实现包括ZSET和ZORDERBYLENGHT命令。

具体来说,Redis的跳表实现包括以下几个部分:

  1. 链表:Redis的链表是一个双向链表,每个节点包含一个有序的元素和一个指向下一个节点的指针。
  2. 字典:Redis的字典是一个哈希表,用于存储跳表节点的索引。每个哈希表节点包含一个键值对,其中键是元素的值,值是跳表节点的指针。
  3. 跳表:Redis的跳表是一个多级结构,每一级都包含一个链表和一个字典。每个节点在每一级中都有一个指针,指向该节点的下一个节点。

当进行插入或删除操作时,Redis会根据元素的值计算出该元素在跳表中的位置,然后将元素插入到相应的级别中。在进行查询操作时,Redis会从最高级的链表开始向下遍历,直到找到第一个大于等于查询元素的节点为止。

需要注意的是,Redis的跳表实现并不是严格按照SkipList的标准算法实现的,而是在SkipList的基础上进行了一些优化和调整,例如使用双向链表代替了单向链表,使用哈希表代替了每个节点都有的游标等。

如图:
在这里插入图片描述
查找32时:

  • 首先从1开始找,大于 1 ,
  • 向右找到25,大于 25,
  • 向右找到100,小于100,
  • 返回25向下找,大于 25,小于50,
  • 继续向下找,大于25
  • 向右找到32

五、Redis的key过期了,为什么内存没有释放

  1. 有可能原来的key设置了过期时间,但修改key值后没有带上过期时间,导致key永远不过期
127.0.0.1:6379> SET  name tom EX 1000 
OK
127.0.0.1:6379> SET name jack 
OK
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> 
  1. Redis的key过期了,内存并没有立即被释放,这可能是因为Redis正在执行一些未完成的写入或读取操作。
  2. Redis 的 key 过期后,其对应的内存空间并不会立即被释放。可能是因为 Redis 使用了一种叫做“惰性删除”的策略来管理内存空间。
    具体来说,当一个 key 过期后,Redis 并不会立即将其从内存中删除。相反,它会将该 key 标记为“过期”,并在下一次垃圾回收时将其删除。这样可以避免频繁地进行内存回收操作,从而提高性能。

在实际使用中,如果需要立即释放过期的键,可以使用Redis提供的主动淘汰策略,例如volatile-ttl(默认值)和allkeys-lru等。这些策略会定期扫描内存中的键,并根据一定的规则将过期的键从内存中淘汰,从而释放内存空间

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

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

相关文章

Java---第四章(数组基础,冒泡排序,二分查找,多维数组)

Java---第四章 一 数组基本知识数组操作 二 数组实操数组排序二分查找二维数组 一 数组 基本知识 概念: 数组是编程语言中的一种常见的数据结构,能够存储一组相同类型的数据 作用: 存储一组相同类型的数据,方便进行数理统计&am…

springboot3生命周期监听的使用和源码解析

定义SpringApplicationRunListener来监听springApplication的启动 1.通过实现springApplicationRunListener来实现监听。 2.在 META-INF/spring.factories 中配置 org.springframework.boot.SpringApplicationRunListener自己的Listener。 在默认的springboot配置中就有给我…

视觉SLAM十四讲——ch12实践(建图)

视觉SLAM十四讲——ch12的实践操作及避坑 0.实践前小知识介绍1. 实践操作前的准备工作2. 实践过程2.1 单目稠密重建2.2 RGB-D稠密建图2.3 点云地图2.4 从点云重建网格2.5 八叉树地图 3. 遇到的问题及解决办法3.1 cmake ..时,出现opencv版本问题3.2 make -j8时&#…

使用腾讯云服务器从零搭建个人网站

前期准备工作 1.服务器重装系统 选择ubuntu18的系统镜像 2.开放端口 需要开放80,27017,3000,22端口 80端口用于配置nginx服务27017端口用于连接mongondb数据库3000端口是启动项目的端口22端口用于ssh远程连接服务器,一般默认会…

SpringBoot - @Transactional注解详解

简介 Spring中的Transactional注解,基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷的解决在开发中碰到的问题,Transactional 的事务开启 ,或者是基于接口的或者是基于类的代理被创建。Spring为了更好的支…

数据库SQL查询(二)之连接查询

本文介绍SQL查询,如何在海量数据中筛选想要数据; 数据库管理系统选择:关系型数据库mysql 数据库管理工具选择:navicat 本文中查询语句和查询案例参考自:https://edu.csdn.net/course/detail/27673?ops_request_mis…

python django vue httprunner 实现接口自动化平台(最终版)

一、项目介绍: 1.1 项目地址 前端地址: GitHub - 18713341733/test_platform_service: django vue 实现接口自动化平台 后端地址: GitHub - 18713341733/test_platform_front: Django vue实现接口自动化平台 1.2 项目介绍 1.2.1 环境…

在 K8S 中部署一个应用 上

本身在 K8S 中部署一个应用是需要写 yaml 文件的,我们这次简单部署,通过拉取网络上的镜像来部署应用,会用图解的方式来分享一下,过程中都发生了什么 简单部署一个程序 我们可以通过 kubectl run 的方式来简单部署一个应用&#…

Python深度学习027:什么是梯度、梯度消失、梯度爆炸以及如何解决

文章目录 1. 梯度的概念2. 梯度更新中存在的问题2.1 梯度消失2.2 梯度爆炸3. 解决办法3.1 梯度消失3.2 梯度爆炸1. 梯度的概念 在机器学习中,梯度是指一个多元函数在某一点处的变化率以及变化的方向。 对于一个参数化的函数,梯度可以告诉我们在一个特定的点处函数值增加最快…

分布式系统概念和设计——Mach实例研究

分布式系统概念和设计 Mach实例研究 Mach主要抽象概述 任务 一个Mach任务是一个执行环境主要包括一个被保护的地址空间和一个内存管理的权能集合这些权能主要用于访问端口 线程 任务可以包含多个线程在共享内存的多处理器中,属于同一个任务的线程可以在不同的处理…

【案例实战】SpringBoot整合Redis实现缓存分页数据查询

正式观看本文之前,设想一个问题,高并发情况下,首页列表数据怎么做? 类似淘宝首页,这些商品是从数据库中查出来的吗?答案肯定不是,在高并发的情况下,数据库是扛不住的,那么…

Java解析XML文件(DOM4J解析xml文件)

内容重点1:DOM4J创建、解析、修改XML文件 内容重点2:DOM4J模拟解析web.xml配置文件,实现实例化servlet 1、什么是xml Xml(Extensible Markup Language) 一种扩展性标示语言,出现的意义其实与JSON字符串的意义相似,是新一代的数据交换标准…

怎么加密共享文件夹?局域网共享文件夹加密方法

相信很多企业都在使用局域网共享文件夹,它可以很方便地实现各部门之间的沟通协作。但是由于使用人员众多,数据安全非常难以得到保障。那么我们该怎么加密局域网共享文件夹呢? 共享文件夹加密 首先,我们先来了解一下共享文件夹加密…

某农业大学数据结构A-第13周作业

1.拓扑排序 【问题描述】 拓扑排序的流程如下: 1. 在有向图中选一个没有前驱的顶点并且输出之; 2. 从图中删除该顶点和所有以它为尾的弧。 重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种情况则…

渲染模式差异和选择

传统服务端渲染 在过去传统开发中,页面渲染任务是由服务端完成的,服务器负责获取数据,拼装页面,客户端仅负责内容显示,使用这种方式的典型技术有 JSP、PHP、ASP.NET 等等。 客户端渲染 CSR Vue.js、React 这类框架之…

专访蘑菇物联沈国辉:做工业AI时代的推动者

在中国制造迈向高质量发展的进程中,数智化转型会成为破局之道。在这其中,蘑菇物联除了是一个本分的答题者,还是一个善于发现问题的贡献者。 作者|思杭 编辑|皮爷 出品|产业家 从广州造纸厂到广州造船厂,从第一橡胶厂到电池厂&a…

利用R语言通过百度地图API进行批量地理编码

利用R语言通过百度地图API进行批量地理编码 当您有大量的地点名称需要在地图上来呈现时,首先要在在线地图上找到该地址的坐标,通常是指经纬度,如果能够用代码来实现,便少了许多费时费力的体力活儿,以下将详细介绍地理…

数据结构的一些总结---利用Python实现

大家好,我是北山啦,本文简单介绍Python数据结构的相关内容,简单就是很简单的那种 文章目录 查找线性查找 O(n)二分查找(Binary Search) O(logn) 排序排序Low B三人组冒泡排序选择排序插入排序 排序NB三人组快速排序归并排序 数据结构栈和队列…

[Day 3 of 17]Building a document scanner in OpenCV

a computer vision-powered document scanner 计算机视觉驱动的文档扫描仪,三个步骤: 边缘检测edges通过边缘,找到代表待扫描纸张的轮廓contour应用透视转换(a perspective transform)获得文档自上而下的视图 How to Build a Kick-Ass Mob…

录音转文字的方法有哪些?这三个录音转文字的方法有哪些

你是否曾经遇到过这样的场景:在开会或者采访时,需要记录重要信息,但是手写记录或打字速度跟不上对话节奏,甚至难以记录所有细节。此时,录音转文字软件就派上用场了。然而,市场上有太多种选择,到…