redis是单线程还是多线程,有哪些特点(linux多线程面试题)

0.redis单线程问题单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。1.为什么说redis能够快速执行(1)绝大部分请求是纯粹的内存操作(非常快速)(2)采用单线程,避免了不必要的上下文切换和竞争条件(3)非阻塞IO-IO多路复用2.redis的内部实现 内部实现采用epoll,采用了epoll+自己…

大家好,又见面了,我是你们的朋友全栈君。

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阻塞;这样就不会因为阻塞在其中一个上而不能处理另一个客户的消息

redis是单线程还是多线程,有哪些特点(linux多线程面试题)

redis是单线程还是多线程,有哪些特点(linux多线程面试题)

 

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的区别是:电话通知是自取还是送票上门

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128948.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 常用格式转换整理(byte转string, int转string….)

    常用格式转换整理(byte转string, int转string….)1、String和int转换(1)Sting转为intStringstr="123";try{inta=Integer.parseInt(str);}catch(NumberFormatExceptione){e.printStackTrace();}(2)int转为StringStringstr="123";try{…

  • 红黑树与平衡二叉树_理解红黑树很难?不存在的,史上最详细的红黑树图解

    HashMap的实现原理可以说是面试中必问的一道面试题了,它可以考察一个程序员的数据结构功底和对技术的钻研深度。Java7中HashMap的实现就是一个数组,然后数组中的每一个元素又是一个链表,这个链表的存在是为了解决哈希冲突导致的问题,就是一个元素经过哈希计算后得到元素的存储位置,但是这个位置已经有其它元素占领,也就是占领元素和新插入元素都在这个数组中的同一个位置,此时就用链表进行维护…

  • 搭建Maven环境——使用本地的maven环境

    搭建Maven环境——使用本地的maven环境

  • 人工智能 – 五子棋人机对战

    人工智能 – 五子棋人机对战人工智能 – 五子棋人机对战作者:jig    阅读人次:6635    文章来源:本站原创    发布时间:2007-7-12    网友评论(8)条 
    原帖及讨论:http://bbs.bccn.net/thread-154777-1-1.html
    */————————————————————————————–
    */出自:编程中国  http://www.

  • 智慧小区智慧物业管理系统一体化解决方案怎么写_小区物业管理系统界面

    智慧小区智慧物业管理系统一体化解决方案怎么写_小区物业管理系统界面传统物业在管理上不仅成本高,服务质量也很难有所保障。现在很多小区都安装了智能物业管理系统,它将信息手段与现代物业管理工作相结合,帮助物业管理团队及时响应客户需求,降低运营成本,提升服务品质。智慧物业是指充分利用物联网、云计算、移动互联网等新一代信息技术的集成应用,将物业各个单位紧密连接起来,实现数据的融合,建立起高效的联动机制。为业主提供一个安全、便利的智慧化生活环境。会比传统物业,带来更舒适的体验感与满意度。随着物联网不断完善,智能技术几乎渗透到各行各业的众多领域。智能运用的迅速发展将颠覆我们的生

    2022年10月18日
  • Java集合面试题[通俗易懂]

    Java集合面试题Java集合框架的基础接口有哪些?Collection,为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。Set,是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。List,是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号