当前位置: 首页 > news >正文

Redis的部分面试题

1.Redis是什么?简述它的优缺点?

Redis的字符串类型是通过简单动态字符串SDS来实现的。简单动态字符串是Redis自己实现的一种字符串表示方式,相比于C语言中的传统字符串,它具有以下几个特点:

1. 动态调整大小:简单动态字符串可以根据需要动态地调整大小。它会根据字符串的长度自动分配足够的内存空间,并且可以根据需要释放多余的空间,以节省内存。

2. 记录长度信息:简单动态字符串会在内部记录字符串的长度信息,这样可以在O(1)的时间复杂度内获取字符串的长度,而不需要每次都遍历整个字符串计算长度。

3. 二进制安全:简单动态字符串可以存储任意二进制数据,而不仅仅局限于文本字符串。这使得Redis的字符串类型非常灵活,可以用于存储各种类型的数据。

4. 内部缓冲区和空终止符:简单动态字符串使用一个内部缓冲区来存储字符串的实际内容,并且以空终止符'\0'作为结束标志。这样可以方便地将简单动态字符串转换为C语言中的传统字符串。

2.Redis为什么这么快?

 简单动态字符串作为Redis字符串类型的底层实现,提供了高效的字符串存储和操作方式。它可以在常数时间内执行字符串长度计算、追加、截取等操作,同时也支持二进制数据的存储和处理。这使得Redis的字符串类型非常适合用于缓存、计数器、计时器等场景

3.Redis相比Memcached有哪些优势?

Redis中的Map类型数据底层的存储方式是使用哈希表Hash Table来实现的。哈希表是一种根据键Key和值Value之间的映射关系进行存储和查找的数据结构。它通过将键映射到一个数组索引的方式来实现高效的存储和查找操作。

 在Redis中,Map类型数据的底层实现是使用了两种不同的哈希表结构:字典Dictionary和压缩列表ZipList。

 1. 字典Dictionary:字典是Redis中最常用的哈希表结构,它使用了哈希函数将键映射到数组索引上,并使用链表来解决哈希冲突。字典的优点是可以处理大量的键值对,并且在查找、插入和删除操作上具有很高的效率。字典在存储大规模的Map类型数据时非常有效。

 2. 压缩列表ZipList:压缩列表是一种紧凑的、连续存储的数据结构,用于存储较小的Map类型数据。它将键值对以连续的方式存储在一块连续的内存区域中,使用特定的编码方式来节省内存空间。压缩列表适用于存储较小的Map类型数据,可以在一定程度上减少内存的使用。

 Redis会根据Map类型数据的大小和其他因素来选择使用字典或压缩列表作为底层的存储结构。对于较大的Map类型数据,Redis会使用字典来存储,以提供高效的存储和查找操作。对于较小的Map类型数据,Redis会使用压缩列表来存储,以节省内存空间。

总之,Redis的Map类型数据底层的存储方式是通过使用哈希表来实现的,具体使用字典或压缩列表取决于数据的大小和其他因素。

4.为什么要用 Redis 做缓存?

Redis的List类型数据底层的存储方式是使用双向链表Doubly Linked List来实现的。

双向链表是一种数据结构,每个节点包含一个值以及指向前一个节点和后一个节点的指针。通过这种链式结构,可以在常量时间内进行插入、删除和访问操作。

在Redis中,List类型数据的底层实现使用了一个双向链表来存储元素。每个节点包含一个值,并通过指针连接到前一个节点和后一个节点。通过这种方式,Redis可以在常量时间内进行以下操作:

 1. 头部插入和删除:在链表的头部进行元素的插入和删除操作,时间复杂度为O(1)。

2. 尾部插入和删除:在链表的尾部进行元素的插入和删除操作,时间复杂度为O(1)。

3. 索引访问:通过索引位置可以快速地访问链表中的元素,时间复杂度为O(n),其中n为链表的长度。

4. 范围访问:可以通过起始索引和结束索引来获取链表中的一段元素,时间复杂度为O(k+n),其中k为范围的长度,n为链表的长度。

由于双向链表的特性,Redis的List类型数据可以支持高效的插入、删除和访问操作。同时,双向链表还可以支持在头部和尾部进行快速的插入和删除操作,非常适合用于实现队列、栈等数据结构。

总之Redis的List类型数据底层的存储方式是通过使用双向链表来实现的,以实现高效的插入、删除和访问操作

Redis的Set类型数据底层的存储方式是使用有序集合Sorted Set来实现的。有序集合是一种基于跳跃表Skip List和哈希表Hash Table的数据结构。

在Redis中,Set类型数据的底层实现是通过使用跳跃表和哈希表的组合来实现的。跳跃表用于存储元素的有序性,而哈希表用于实现快速的查找和插入操作。

跳跃表是一种有序的链表结构,它包含多个层级,每个层级都是一个有序的链表。每个节点包含一个元素以及指向下一层级的指针。通过这种层级结构,跳跃表可以快速地进行元素的查找和插入操作,平均时间复杂度为O(log n)。

哈希表用于存储元素的值和对应的分数score

重点

Redis的跳跃表(Skip List)是一种基于随机化的数据结构,用于实现有序集合(Sorted Set)的底层数据结构。它类似于平衡树,但是相比于平衡树,跳跃表的插入、删除和查找操作都更加高效。 跳跃表由多个层级组成,每一层都是一个有序的链表。每个节点都包含一个分值和一个指向下一层节点的指针。在每一层中,节点的数量都是随机的,但是节点之间的分值都是有序的。最底层的链表包含所有的节点,而最高层的链表只包含一个节点,这个节点是所有节点中分值最大的节点。 在跳跃表中,查找操作的时间复杂度为O(log n),与平衡树相同。但是,跳跃表的实现更加简单,而且在插入和删除操作中,跳跃表的性能都比平衡树更加优秀。因此,Redis中使用跳跃表作为有序集合的底层数据结构,可以提高有序集合的性能。 总之,跳跃表是一种高效的数据结构,用于实现有序集合。它通过随机化和多层链表的结构,实现了高效的插入、删除和查找操作。

相关文章:

Redis的部分面试题

1.Redis是什么?简述它的优缺点? Redis的字符串类型是通过简单动态字符串SDS来实现的。简单动态字符串是Redis自己实现的一种字符串表示方式,相比于C语言中的传统字符串,它具有以下几个特点: 1. 动态调整大小:简单动态字符串可…...

单通道 6GSPS 16位采样DAC子卡模块--【资料下载】

FMC147是一款单通道6.4GSPS(或者配置成2通道3.2GSPS)采样率的12位AD采集、单通道6GSPS(或配置成2通道3GSPS)采样率16位DA输出子卡模块,该板卡为FMC标准,符合VITA57.4规范,该模块可以作为一个理想…...

Python 文件操作详解

概要 Python进行文件操作,在日常编程中是很常用的。为了方便大家,这里对各种文件操作的知识进行汇总。一文在手,无须它求!来一起学习吧。 一、文件的打开和关闭 open()函数 f1 open(rd:\测试文件.txt, moder, encodingutf-8) c…...

【Rust 基础篇】Rust Never类型:表示不会返回的类型

导言 Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。在Rust中,Never类型是一种特殊的类型,它表示一个函数永远不会返回。Never类型在Rust中有着重要的应用场…...

error “Component name “*****“ should always be multi-word”解决方案

问题 在 vue-cli 创建的项目中,创建文件并命名后,会报 “Component name "*****" should always be multi-word” 报错; Component name "index" should always be multi-word.eslintvue/multi-word-component-names原…...

前后端开发的区别是什么?

VUE的开发方式为什么和后端的MVC开发方式不一样呢? 实际上,Vue 和后端开发的 MVC(Model-View-Controller)方式是不同的,因为它们面对的问题和场景也不同。 前端与后端的职责不同: 前端和后端的职责和任务不…...

小白电脑装机(自用)

几个月前买了配件想自己装电脑,结果最后无法成功点亮,出现的问题是主板上的DebugLED黄灯常亮,即DRAM灯亮。对于微星主板的Debug灯,其含义这篇博文中有说明。 根据另一篇博文,有两种可能。 我这边曾将内存条和主板一块…...

Quic协议 0-RTT

目录 1、Quic协议 2、Quic直接通过TLS握手进行建立链接,TLS是1.3版本 3.1、通过缓存服务器公钥实现0-RTT,服务器 通过kdf密钥派生机制,来产生会话加密key,保证数据向前安全性 3.2、通过PKN来实现数据重传保证数据完整性&…...

在排序数组中查找元素的第一个和最后一个位置——力扣34

文章目录 题目描述法一 二分查找题目描述 法一 二分查找 int bsearch_1(int l, int r) {while (l < r)<...

python列表处理方法

原始文件&#xff1a; id start end a1 10 19 a1 25 34 a2 89 124 a2 149 167 a2 188 221目的文件&#xff1a; a1 1 10 a1 16 25 a2 1 36 a2 61 79 a2 100 133解释说明&#xff1a; 原始文件是gff3文件的一部分&#xff0c;第一列id是基因的名字&#xff0c;第二列和第三列分…...

【Java】快速入门JVM

文章目录 1. JVM简介2. 类加载简介3. 类加载的过程4. 双亲委派5. GC垃圾回收6. JVM的回收方式7. 分代回收 1. JVM简介 JVM&#xff08;Java虚拟机&#xff09;是一个名字为Java的进程,是用于执行Java程序的虚拟机。 JVM会从操作系统中申请一大块内存空间,又把这个内存空间划分…...

C#之Winfrom自定义输入框对话框。

如果你需要一个带有输入框的对话框&#xff0c;并在输入完成后接收输入的值&#xff0c;你可以使用自定义窗体来实现。以下是一个示例代码&#xff1a;创建一个继承自 Form 的自定义窗体类&#xff0c;命名为 InputDialogForm&#xff0c;并将窗体上放置一个文本框&#xff08;…...

docker制作镜像

docker制作镜像 docker制作镜像有两种&#xff1a; 1.docker build dockerfile 2.基于容器制作镜像 基于容器制作镜像 语法&#xff1a;docker commit options 容器名称 参数&#xff1a; -a&#xff1a;作者 -c&#xff1a;修改dockfile创建的镜像 -m&#xff1a;提交…...

广西茶叶元宇宙 武隆以茶为媒 推动茶文旅产业融合发展

8月4日&#xff0c;重庆市武隆区启动为期3天的“武隆首届玩茶荟”。本次活动以“中国最美玩茶地——武隆”为主题&#xff0c;吸引众多国内知名专家、茶企和茶馆相关负责人&#xff0c;共同探索武隆茶文旅融合发展新路径和新业态。 广西茶叶元宇宙&#xff1a;广西茶叶元宇宙 …...

alibaba.excel库使用

目录 依赖 实体类 Controller Service 所用到的接口及工具类 ExcelUtil ExcelListener DefaultExcelListener DefaultExcelResult ExcelResult JsonUtils SpringUtils StreamUtils ValidatorUtils SpringUtils 使用alibab中的excel库来实现excel的导入、导出 依赖 <de…...

机器学习模型选择评估和超参数调优

如何选择模型&#xff1f;如何评估模型&#xff1f;如何调整模型的超参数&#xff1f;模型评估要在测试集上进行&#xff0c;不能在训练集上进行&#xff0c;否则评估的准确率总是100%。所以&#xff0c;一般我们准备好数据集后&#xff0c;要将其分为训练集和测试集&#xff0…...

深入浅出 Typescript

TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 标准&#xff08;ES6 教程&#xff09;。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大型应用&#xff0c;它可以编译成纯 JavaScript&#xff0c;编译出来的 JavaScript …...

Vue3和TypeScript项目-移动端兼容

1 全局安装typescript 2 检测安装成功 3 写的是ts代码&#xff0c;但是最后一定要变成js代码&#xff0c;才能在浏览器使用 这样就会多一个js文件 3 ts语法 数组语法 对象语法 安装vue3项目 成功后进入app。安装依赖。因为我们用的是脚手架&#xff0c;要引入东西的时候不需要…...

基于STM32CubeMX和keil采用通用定时器中断实现固定PWM可调PWM波输出分别实现LED闪烁与呼吸灯

文章目录 前言1. PWM波阐述2. 通用定时器2.1 为什么用TIM142.2 TIM14功能介绍2.3 一些配置参数解释2.4 PWM实现流程&中断2.4.1 非中断PWM输出(LED闪烁)2.4.2 中断PWM输出(LED呼吸灯) 3. STM32CubeMX配置3.1 GPIO配置3.2 时钟配置3.3 定时器相关参数配置3.4 Debug配置3.5 中…...

mysql大表的深度分页慢sql案例(跳页分页)

1 背景 有一张表&#xff0c;内容是 redis缓存中的key信息&#xff0c;数据量约1000万级&#xff0c; expiry列上有一个普通B树索引。 -- test.top definitionCREATE TABLE top (database int(11) DEFAULT NULL,type varchar(50) DEFAULT NULL,key varchar(500) DEFAULT NUL…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...