面试 Redis 八股文十问十答第二期

面试 Redis 八股文十问十答第二期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)redis 一般都用在什么场景?

Redis(Remote Dictionary Server)通常用于以下场景:

  • 缓存: Redis 可以作为缓存存储数据,可以帮助加速访问频繁的数据,减轻后端数据库的压力。
  • 会话缓存: 用于存储用户的会话信息,可以帮助实现分布式会话管理,提高系统的扩展性和性能。
  • 消息队列: Redis 的发布/订阅功能和列表数据类型可以用于实现简单的消息队列,用于解耦和异步处理任务。
  • 计数器: Redis 的计数器功能可以用于实现各种计数场景,如网站访问量统计、点赞数统计等。
  • 实时排行榜: Redis 的有序集合数据类型可以用于实现实时排行榜功能,如热门商品排行、热门搜索排行等。
  • 分布式锁: Redis 的分布式锁功能可以用于实现分布式系统中的并发控制,确保多个客户端对共享资源的安全访问。

2)redis 为什么这么快?

Redis 之所以快速,主要有以下几个方面的原因:

  • 内存存储: Redis 将数据存储在内存中,读写速度非常快,因为内存的访问速度比磁盘快得多。
  • 单线程模型: Redis 使用单线程模型,避免了多线程之间的线程切换开销和锁竞争,提高了处理请求的效率。
  • 非阻塞 I/O: Redis 使用了非阻塞 I/O 多路复用机制,通过一个线程来管理多个客户端连接,减少了网络 I/O 的开销。
  • 高效的数据结构: Redis 提供了丰富的数据结构,如字符串、列表、哈希表、集合、有序集合等,可以更加高效地存储和操作数据。

3)redis 为什么要设计成单线程?6.0 不是变成多线程了吗?

Redis 最初设计为单线程的主要原因是为了简化实现和提高性能。单线程模型避免了多线程之间的线程切换开销和锁竞争,同时利用了操作系统的非阻塞 I/O 多路复用机制,提高了处理请求的效率。

在 Redis 6.0 中引入了多线程支持,主要是为了充分利用多核处理器的性能。但是这并不意味着 Redis 的设计变成了多线程。多线程模型在某些场景下可能会提高并发能力,但也增加了复杂性和风险,比如线程间的同步与通信、锁竞争等问题。因此,Redis 6.0 仍然采用了单线程和多进程的混合模型,其中单线程处理网络 I/O 和协议解析,而后端任务通过多个线程执行,这样既保留了单线程模型的优势,又能充分利用多核处理器的性能。

4)redis 常见的数据类型有哪些?

Redis 支持多种数据类型,每种数据类型都有不同的特点和用途。常见的数据类型包括:

  • 字符串(String): 最基本的数据类型,可以存储字符串、整数或者浮点数。
  • 哈希表(Hash): 类似于字典,可以存储多个键值对,每个键值对都是一个字段和对应的值。
  • 列表(List): 类似于链表,可以存储多个有序的元素,支持头部和尾部的插入、删除操作。
  • 集合(Set): 类似于集合,可以存储多个不重复的元素,支持并集、交集、差集等操作。
  • 有序集合(Sorted Set): 类似于有序集合,可以存储多个元素,并为每个元素分配一个分数,元素根据分数排序。

5)详细说说 redis 跳表的实现?

Redis 中的跳表(Skip List)是一种有序数据结构,可以用来实现有序集合(Sorted Set)。跳表通过在原始链表的基础上添加多层索引,以提高查找效率。

跳表的实现主要包括以下几个步骤:

  1. 节点结构: 跳表中的每个节点包含多个指针,指向同一层中下一个节点和下一层中相同位置的节点。
  2. 头部节点: 跳表有一个头部节点,它不存储任何数据,只作为入口节点。
  3. 层级索引: 跳表中的每个节点都可能有多个层级索引,每个层级索引都是一个链表节点,它指向下一个节点。
  4. 插入操作: 在插入新元素时,需要按照一定的规则确定元素应该插入的层级,然后更新相应的索引。
  5. 删除操作: 删除元素时,需要找到对应的节点并删除,同时更新索引。
  6. 查找操作: 通过跳表的索引结构,可以快速定位到待查找元素的大致位置,然后在对应层级的链表中进行查找。

跳表的时间复杂度为 O(log n),与平衡二叉树的性能相当,但实现起来比较简单,并且不需要像平衡二叉树那样复杂的平衡操作。

6)redis 的 hash 可以详细讲讲吗?

Redis 的哈希表(Hash)是一种类似于字典的数据结构,可以存储多个键值对,每个键值对都是一个字段和对应的值。Redis 的哈希表支持以下操作:

  • 添加字段(HSET): 将指定字段的值设置为指定的值。
  • 获取字段值(HGET): 获取指定字段的值。
  • 删除字段(HDEL): 删除指定字段。
  • 判断字段是否存在(HEXISTS): 判断指定字段是否存在。
  • 获取所有字段(HKEYS): 获取哈希表中的所有字段。
  • 获取所有值(HVALS): 获取哈希表中的所有值。

哈希表在 Redis 中的内部实现使用了类似于字典的结构,具体来说,它使用了哈希表和链表相结合的方式来实现,其中哈希表用于快速查找字段,链表用于解决哈希冲突。在 Redis 中,哈希表的扩容操作采用了渐进式 rehash 策略,即在扩容过程中仍然可以对哈希表进行读写操作,减少了扩容过程的阻塞时间。

7)redis 和 memcached 有什么区别?

  • 数据类型支持: Redis支持更丰富的数据类型,如字符串、哈希、列表、集合、有序集合等,而Memcached只支持简单的键值对存储。
  • 持久化: Redis支持持久化,可以将数据保存到磁盘上,而Memcached不支持持久化。
  • 数据复杂度: Redis对于更复杂的数据处理(如排序、范围查找等)更友好,而Memcached更适合简单的键值缓存。
  • 内存管理: Redis采用多种内存管理技术,可以更灵活地控制内存的使用,而Memcached的内存管理相对简单。

8)redis 可以实现事务吗?

是的,Redis 支持事务。Redis 的事务通过 MULTI、EXEC、WATCH、DISCARD 等命令实现。在事务中,客户端可以将多个命令组合在一起,然后一次性发送给 Redis 服务器执行。Redis 在执行事务期间会将命令序列化,保证事务的原子性。如果在 EXEC 执行之前,有被 WATCH 监控的键发生了变化,那么事务将被打断。

9)redis 的过期策略可以说说吗?

Redis 的过期策略主要有两种:

  • 定时删除: Redis 使用一个定时器(每秒执行10次)来检查键是否过期,过期的键会被定期删除。
  • 惰性删除: 当访问一个键时,Redis 会先检查该键是否过期,如果过期则删除。这种策略可以节省内存,但会增加访问时的延迟。

10)redis 的内存淘汰策略有哪些?

当内存不足时,Redis 可以通过一些策略来淘汰部分数据以释放内存,常见的内存淘汰策略包括:

  • LRU(Least Recently Used): 淘汰最近最少使用的键。
  • LFU(Least Frequently Used): 淘汰最不经常使用的键。
  • TTL(Time To Live): 淘汰具有过期时间的键。
  • 随机淘汰: 随机选择一些键进行淘汰。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 1300+ Star,2W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

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

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

相关文章

搜维尔科技:使用Touch 触觉力反馈设备,用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中

使用Touch 触觉力反馈设备,用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中 搜维尔科技:使用Touch 触觉力反馈设备,用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中

文件编码概念

文件的读取 open()函数: 打开一个已存在的文件,或者创建一个新文件 open(name,mode,encoding) name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径) mode:设置打开文件的模式(访问模式)&am…

C语言—字符函数和字符串函数

1.字符分类函数 C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件 ctype.h。 例:将一句话中的小写字母改成大写字母。 2.字符转换函数 头文件:ctype.h C语言提供了2…

【数据集划分】假如你有超百万条oracle数据库数据(成真版)

【数据集划分】假如你有接近百万条oracle数据库数据(成真版) 写在最前面小结 数据集划分原因注意事项 1. 留出法(Hold-out Method)原理算法复杂度代码示例Scikit-learn的train_test_split分布式计算框架(如Apache Spar…

JVMの垃圾回收

在上一篇中,介绍了JVM组件中的运行时数据区域,这一篇主要介绍垃圾回收器 JVM架构图: 1、垃圾回收概述 在第一篇中介绍JVM特点时,有提到过内存管理,即Java语言相对于C,C进行的优化,可以在适当的…

DRIVEN|15分的CNN+LightGBM怎么做特征分类,适用于转录组

说在前面 今天分享一篇做深度学习模型的文章,这是一篇软硬结合的研究,排除转换实体产品,我们做生信基础研究的可以学习模仿这个算法,适用且不局限于临床资料,转录组数据,GWAS数据。 今天给大家分享的一篇文…

用香橙派AIpro部署大模型、安装宝塔搭建私有随身WEB开发环境

什么是香橙派 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇腾 AI 处理器,可提供 8TOPS INT8 的计算能力,内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算,可广泛…

【路径规划】基于蚁群算法ACO促进水果检测数据集的获取附matlab代码

% 初始化蚁群算法参数 num_ants 20; % 蚂蚁数量 num_iterations 100; % 迭代次数 alpha 1; % 信息素重要程度参数 beta 2; % 启发式信息重要程度参数 rho 0.5; % 信息素挥发率 Q 1; % 信息素增加量 pheromone_initial 0.1; % 初始信息素浓度 num_nodes 100; % 图中节点…

JL-8B/2211电流继电器 带板前接线底座 约瑟JOSEF

JL-8集成电路电流继电器 系列型号 JL-8A/11集成电路电流继电器;JL-8B/11集成电路电流继电器; JL-8A/12集成电路电流继电器;JL-8B/12集成电路电流继电器; JL-8A/13集成电路电流继电器;JL-8B/13集成电路电流继电器; JL-8A/21集成电路电流继电器;JL-8B/21集成电路电流继电器; JL-…

Mamba v2诞生:1 儒(Transformers)释(SSD)道(Mamba)本是一家?!

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技(Mamba,xLSTM,KAN)则提…

【前端每日基础】day44——vue2和vue3的区别

1. Composition API vs Options API Vue 2 (Options API) 在 Vue 2 中,组件的逻辑通常是通过 data、methods、computed 等选项来定义的。 // Vue 2 组件 export default {data() {return {count: 0}},computed: {doubleCount() {return this.count * 2;}},methods…

foreach、for in和for of之间区别?

foreach、for in和for of都是用于循环遍历数组或对象的方法,但它们之间有一些区别。 1. foreach:是数组的原生方法,可以遍历数组中的每个元素,但是无法中途中断循环或者跳出循环。它只接受一个回调函数作为参数,参数为…

RPA-UiBot6.0数据采集机器人(海量信息一网打尽)内附RPA师资培训课程

前言 友友们是否曾为海量的数据信息而头疼,不知道如何从中精准抓取你所需的数据?小北的这篇博客将为你揭晓答案,让我们一起学习如何运用RPA数据采集机器人,轻松实现海量信息的快速抓取与整理,助力你的工作效率翻倍! 诚邀各位友友参与小北博客的评论,共同开启自动…

传输大咖24|镭速传输揭秘:确保UDP数据完整性的先进策略

在现代网络通信中,UDP(User Datagram Protocol)因其低延迟和高效率的特点而受到青睐,尤其是在需要快速传输大量数据的场景中。然而,UDP协议本身并不保证数据的可靠性和一致性,这就要求使用UDP进行数据传输的…

【JAVASE】异常(下)

四:异常的处理 (2)try-catch捕获并处理 throws 对异常并没有处理,而是将异常报告给抛出异常方法的调用者,由调用者处理。如果真正要对异常进行处理,就需要try-catch 语法格式: 语法格式&#…

springcloud Feign调用拦截器(统一处理拷贝请求头实现透传信息、内部调用鉴权、打印feign调用)

springcloud Feign调用拦截器(统一处理拷贝请求头实现透传信息、内部调用鉴权、打印feign调用日志) 实现接口Feign.RequestInterceptor 实现接口 feign.RequestInterceptor 并注入到IOC容器即可生效 示范代码如下 拷贝请求头,将原请求信…

SVN安装详细教程

📖SVN安装详细教程 ✅1. 下载✅2. 安装✅3. 使用 ✅1. 下载 官方地址:https://tortoisesvn.net/downloads.html 123云盘地址:https://www.123pan.com/s/4brbVv-rsoWA.html ✅2. 安装 双击TortoiseSVN-1.14.6.29673-x64-svn-1.14.3.msi安装…

宇宙数字宣布2023年上半年盈利翻倍,数字货币挖矿业务持续增长

2023年3月8日宇宙数字公司在2023年上半年盈利翻倍的消息,彰显了该公司在数字货币挖矿领域的卓越表现和领先地位。这一成就是宇宙数字创新研发策略成功的明证,同时也体现了其高效能挖矿产品和解决方案在全球市场的广泛认可和需求。 随着数字货币市场的持续变化和发展,宇宙数字公…

VBA跨Excel工作薄,按照Excel工作表样板表行高、列宽值调整目标工作表行高、列宽

点击观看视频效果 文章目录 前言1.数字转字母2.获取单元格行高3.获取单元格列宽4.调整行高、列宽前言 格式刷在我们调整Excel工作表、Word文档的格式时经常使用到,它可以帮助我们快速批量调整字体、大小、颜色、背景色等,甚至是表格行高列宽、字间距大小等。但如果在不同的E…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU

持续学习&持续更新中… 学习态度:守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU 接口文档地址三级分类效果图建表后台组建数据的树形结构在人人(后台管理系统)中实现管理商品的三级分类路径规则使用…