Redis面试题(一): Redis到底是多线程还是单线程?

2023-11-01

0. redis单线程问题

    单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。

 

1. 为什么说redis能够快速执行

(1) 绝大部分请求是纯粹的内存操作(非常快速)

(2) 采用单线程,避免了不必要的上下文切换和竞争条件

(3) 非阻塞IO - IO多路复用

 

 

2. redis的内部实现

内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。

 

3. Redis关于线程安全问题

     redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁。

 

4. IO多路复用

        参考: https://www.zhihu.com/question/32163005

要弄清问题先要知道问题的出现原因

原因:

由于进程的执行过程是线性的(也就是顺序执行),当我们调用低速系统I/O(read,write,accept等等),进程可能阻塞,此时进程就阻塞在这个调用上,不能执行其他操作.阻塞很正常.

接下来考虑这么一个问题:一个服务器进程和一个客户端进程通信,服务器端read(sockfd1,bud,bufsize),此时客户端进程没有发送数据,那么read(阻塞调用)将阻塞,直到客户端调用write(sockfd,but,size)发来数据.在一个客户和服务器通信时这没什么问题;

当多个客户与服务器通信时当多个客户与服务器通信时,若服务器阻塞于其中一个客户sockfd1,当另一个客户的数据到达套接字sockfd2时,服务器不能处理,仍然阻塞在read(sockfd1,...)上;此时问题就出现了,不能及时处理另一个客户的服务,咋么办?

I/O多路复用来解决!

 

I/O多路复用:

继续上面的问题,有多个客户连接,sockfd1,sockfd2,sockfd3..sockfdn同时监听这n个客户,当其中有一个发来消息时就从select的阻塞中返回,然后就调用read读取收到消息的sockfd,然后又循环回select阻塞;这样就不会因为阻塞在其中一个上而不能处理另一个客户的消息

 

Q:

那这样子,在读取socket1的数据时,如果其它socket有数据来,那么也要等到socket1读取完了才能继续读取其它socket的数据吧。那不是也阻塞住了吗?而且读取到的数据也要开启线程处理吧,那这和多线程IO有什么区别呢?

A:

1.CPU本来就是线性的不论什么都需要顺序处理并行只能是多核CPU

2.io多路复用本来就是用来解决对多个I/O监听时,一个I/O阻塞影响其他I/O的问题,跟多线程没关系.

3.跟多线程相比较,线程切换需要切换到内核进行线程切换,需要消耗时间和资源.而I/O多路复用不需要切换线/进程,效率相对较高,特别是对高并发的应用nginx就是用I/O多路复用,故而性能极佳.但多线程编程逻辑和处理上比I/O多路复用简单.而I/O多路复用处理起来较为复杂.

 

5. 使用Redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2) 支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 原子性操作

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

 (5) Redis部分支持事务,不支持的是:强一致性

能干嘛: 一个队列中,一次性、顺序性、排他性的执行一系列命令

(重点)不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚,这也就是:Redis部分支持事务。  参考外链

 

6. Redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

(4)Redis支持数据的备份,即master-slave模式的数据备份。

(5) 使用底层模型不同,它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

(6)value大小:redis最大可以达到1GB,而memcache只有1MB

 

 

 

7. Redis常见性能问题和解决方案:

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件;(Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照;AOF文件过大会影响Master重启的恢复速度)

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...;这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

 

 

8. Redis的回收策略

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。

  使用策略规则:

  1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru

  2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random

 

 

9. 五种I/O模型介绍

IO 多路复用是5种I/O模型中的第3种,对各种模型讲个故事,描述下区别:

故事情节为:老李去买火车票,三天后买到一张退票。参演人员(老李,黄牛,售票员,快递员),往返车站耗费1小时。

1.阻塞I/O模型

老李去火车站买票,排队三天买到一张退票。

耗费:在车站吃喝拉撒睡 3天,其他事一件没干。

 

 

2.非阻塞I/O模型

老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。

耗费:往返车站6次,路上6小时,其他时间做了好多事。

 

 

3.I/O复用模型

 

1.select/poll

 

老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。 

 

耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次

2.epoll

 

老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。 

 

耗费:往返车站2次,路上2小时,黄牛手续费100元,无需打电话

 

 

4.信号驱动I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。 

耗费:往返车站2次,路上2小时,免黄牛费100元,无需打电话

 

 

5.异步I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。 

耗费:往返车站1次,路上1小时,免黄牛费100元,无需打电话

 

1同2的区别是:自己轮询

2同3的区别是:委托黄牛

3同4的区别是:电话代替黄牛

4同5的区别是:电话通知是自取还是送票上门

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis面试题(一): Redis到底是多线程还是单线程? 的相关文章

随机推荐

  • Ubuntu----Linux命令-----防火墙(查看、关闭、启动)

    一 查看防火墙状态 命令 ufw status 说明 活动 防火墙是开启的 不活动 防火墙是关闭的 二 开启防火墙 命令 sudo ufw enable 开启防火墙后 可以查看防火墙状态 三 关闭防火墙 命令 sudo ufw disabl
  • 真香!27寸三星曲面屏写代码零Bug,包邮送一台!

    最近有粉丝留言让我多搞些抽奖活动 为了感谢大家对本公众号的大力支持本次联合了10个号主 送27寸三星曲面屏显示器 祝所有人新的一年工作顺利 工资芝麻开花节节高 希望本次抽奖可以给你带来好运 生活不易 望大家加倍努力 升职加薪 事业家庭双丰收
  • 使用Vue + vue-i18n搭建国际化网站

    有时候项目的页面需要能够切换多种语言来显示 可以使用vue i18n这个插件库来实现功能 一 安装vue i18n依赖 NPM npm install vue i18n Yarn yarn add vue i18n 二 创建国际化文件夹和文
  • 【经典排序算法】1. 冒泡排序

    代码如下 public class Main 实例演示 public static void main String args int arr 3 5 6 2 1 arrPrint arr BubbleSort arr arrPrint a
  • 纯CSS实现锚点跳转位置上下偏移的办法

    昨天在sf的时候看到了一位朋友的提问 是问如何使页面上的a标签被点击时跳转的锚点的位置往下偏移一点 不会被最上方的header给遮盖 当时看到这个问题也没想出纯CSS的解决方法 以为只有用js才能实现 后来另一位朋友的解答 恍然大悟 在他给
  • (转)少儿编程这么火, 究竟学哪一种语言最靠谱?这篇文章说透了!

    http www sohu com a 251561825 124768 这几年 人工智能的发展速度与日俱增 AlphaGo赢了柯洁 百度无人巴士量产 Google的AI客服 用一个简单的 嗯哼 征服了全世界 索尼也用AI创造了一首Beat
  • UINavigationBar添加渐变的背景颜色

    为UINavigationBar设置背景颜色是很常见的需求 一般设置导航栏背景颜色操作如下 直接设置barTintColor即可 navigationController navigationBar barTintColor UIColor
  • 自定义百度地图控件位置

    在写百度地图的时候 遇到了一个小问题 我是把百度地图作为背景 页面上还有其他数据 需要添加一个控件 这就涉及到了自定义控件位置的问题了 官方文档上只给了上左 BMAP ANCHOR TOP LEFT 上右 BMAP ANCHOR TOP R
  • 步进电机基本原理及驱动方式详解

    步进电机基本原理及驱动方式详解 步进电机相关概念 基本原理 类型和结构 转子结构 定子结构 励磁方式 ATD9800 驱动使用实例 参考文献 步进电机相关概念 步进电机是一种常用于控制和定位应用的电动机 其独特的工作方式使其在许多领域中都具
  • linux tcl环境安装

    1 安装tcl 下载tcl网址 http www tcl tk software tcltk download html 编译说明网址 http www tcl tk doc howto compile html unix gunzip l
  • flutter 使用阿里图标

    1 下载图标 阿里图标 2 解压 将iconfont ttf放入lib assets icons内 解压下载的阿里图标文件 我们只需要里面的iconfont ttf文件 将iconfont ttf文件放入lib assets icons内
  • hadoop资料汇总贴

    一 Hadoop快速入门 分布式计算开源框架Hadoop 入门实践 福布斯 Hadoop 你不得不了解的大数据工具 用 Hadoop 进行分布式数据处理 入门 Hadoop入门 一图解说Hadoop的发展历程 讨论 Hadoop社区与中国云
  • C语言进阶——动态内存管理

    作者 敲代码 流川枫 博客主页 流川枫的博客 专栏 C语言从入门到进阶 语录 Stay hungry stay foolish 工欲善其事必先利其器 给大家介绍一款超牛的斩获大厂offer利器 牛客网 点击免费注册和我一起刷题吧 文章目录
  • 单片机项目实训

    把时髦的技术挂在嘴上 不如把过时的技术记在心里 目录 一 单片机项目实训 项目实战 基于NRF905的多点温度无线采集系统 项目实战 基于NRF24L01的多点温湿度无线采集系统 项目实训 篮球计分系统设计 无线nRF905版本 项目实训
  • 鸿蒙珠融入体内,斗罗大陆同人小说排行榜。第一名:《斗罗大陆之超级无敌》:主角...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 斗罗大陆同人小说排行榜 第一名 斗罗大陆之超级无敌 主角玉天龙被鸿蒙紫珠带着穿越到斗罗大陆 遁入柳二龙体内 柳二龙未与他人交合 便生下玉天龙 斗罗大陆之超级无敌 这本书拥有系统 鸿蒙紫珠 召唤技
  • 项目开发中常见问题汇总

    已经在拦截中配置访问静态资源不拦截 但是在访问静态资源时 仍然出现404错误 解决办法 在配置文件中配置 spring mvc static path pattern static spring web resources static l
  • VC6与VISIO2007的冲突

    装了VC6 在 文件 gt 打开 时会出错 以下是查到的解决方法 如果在VC6 0中的 FileView 右键点 add files to folder 或者在Project菜单点Add to project Files都会报devshl
  • element表格实现溢出隐藏单元格增加复制按钮

    此功能可以实现只写一个公共复制按钮 可以在多个页面的表格中使用 项目框架为vue 用到了element ui vuex clipboard 如果不想使用vuex 则需要想办法把复制按钮的位置x y坐标写成公共的变量 1 复制按钮 如果整个项
  • 使用dd命令制作Ubuntu U盘启动盘(使用U盘启动盘安装Ubuntu系统)

    1 查看挂载的U盘的设备名称 sudo fdisk l 2 如果U盘还在挂载状态 卸载它 否则 会提示设备或资源正忙 umount dev u盘名 3 格式化U盘 sudo mkfs ntfs f dev u盘名 4 写入启动引导 sudo
  • Redis面试题(一): Redis到底是多线程还是单线程?

    0 redis单线程问题 单线程指的是网络请求模块使用了一个线程 所以不需考虑并发安全性 即一个线程处理所有网络请求 其他模块仍用了多个线程 1 为什么说redis能够快速执行 1 绝大部分请求是纯粹的内存操作 非常快速 2 采用单线程 避