02----------为什么说redis是单线程

10 篇文章 0 订阅

1.首先说明并发和并行的区别:

通俗点说 并发就是不同线程同时干一件事情
并行就是不同线程同时干不同的事情

2.Redis不存在线程安全问题? 

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

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

Redis为什么这么快

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;

3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

4、使用多路I/O复用模型,非阻塞IO;

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

以上几点都比较好理解,下边我们针对多路 I/O 复用模型进行简单的探讨:

(1)多路 I/O 复用模型

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。

原因:

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

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

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

I/O多路复用来解决!

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

那这样子,在读取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多路复用处理起来较为复杂.

警告1:这里我们一直在强调的单线程,只是在处理我们的网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的,这里需要大家明确的注意一下!例如Redis进行持久化的时候会以子进程或者子线程的方式执行(具体是子线程还是子进程待读者深入研究)

警告2:Redis 4.0版本开始会支持多线程的方式,但是,只是在某一些操作上进行多线程的操作!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
### 回答1: Redis是一个开源的内存数据库,使用C语言编写。它支持多种数据结构,如字符串、哈希表、列表、集合等。Redis-6.2.6是Redis的一个版本,而"windows"则代表它的部署环境是Windows操作系统。 相对于Linux环境,Windows上的Redis部署略有不同。首先,在Windows上安装Redis需要下载Redis的Windows版本,并解压到指定目录。接下来,使用命令行工具进入Redis所在目录,并通过运行redis-server.exe启动Redis服务器。 在Windows上,Redis默认以后台运行的方式启动,可以通过运行redis-cli.exe来连接Redis服务器并执行命令。可以使用redis-cli.exe的各种命令来操作Redis数据库,例如设置键值对、获取键值对、删除键值对等。 Redis-6.2.6在Windows上的功能与其他平台上的版本基本相同,但在Windows平台上使用Redis可能会面临一些限制。例如,由于Windows操作系统的限制,Redis-6.2.6在Windows上不能以集群模式启动,也无法使用Unix套接字来进行进程间通信。 此外,Redis-6.2.6在Windows上的性能可能会受到一些影响,因为Windows操作系统在处理网络请求和文件IO方面相对较慢。因此,在生产环境中,推荐将Redis部署在Linux等类Unix系统上,以获得更好的性能和稳定性。 总之,Redis-6.2.6可以在Windows上部署和使用,但需要注意一些限制和性能方面的考虑。 ### 回答2: Redis是一个开源的,内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis 6.2.6是Redis最新的稳定版本,适用于Windows操作系统。在Windows上安装Redis需要进行一些步骤。 首先,我们需要在Redis的官方网站上下载Redis 6.2.6的Windows版本安装包,下载完成后解压缩到一个目录中。 接下来,进入Redis解压目录,在该目录下找到redis.windows.conf文件并打开,可以进行一些配置的修改,比如设置监听的端口号等。 然后,我们需要打开命令提示符或PowerShell窗口,进入Redis解压目录,并执行redis-server.exe redis.windows.conf命令,这将启动Redis服务器。 此时,我们可以通过执行redis-cli.exe命令进入Redis客户端,这样我们就可以与Redis进行交互了。 在Redis客户端中,我们可以使用一系列命令来操作Redis数据库,比如设置键值对、获取键值对、删除键值对等。 另外,如果需要使用Redis作为缓存或消息中间件,我们可以在应用程序中通过Redis的客户端库来连接和操作Redis数据库。 总结来Redis 6.2.6是Redis的最新稳定版本,适用于Windows操作系统。我们可以通过下载安装包并解压缩来安装Redis,在启动Redis服务器后,使用redis-cli命令进入Redis客户端,通过命令来与Redis进行交互和操作数据。 ### 回答3: Redis是一个开源的、基于内存的数据结构存储系统。Redis-6.2.6是Redis的一个版本,特指该版本适用于Windows操作系统。 相比于Linux系统,Windows环境下使用Redis有一些特殊的注意事项。首先,在Windows下使用Redis时,官方默认提供了基于MS Open Tech的Redis for Windows版本,这是官方维护的Windows版本。其次,需要注意的是Redis在Windows下的性能比Linux下稍差,主要是因为Windows下的文件系统性能与Linux下的不同导致的。 在Windows环境中安装Redis-6.2.6需要进行以下一些步骤。首先,从Redis官方网站下载Redis for Windows的可执行文件。然后,解压缩下载的压缩包并进入解压后的目录。接下来,运行redis-server.exe启动Redis服务,此时Redis服务器就开始监听默认的6379端口。可以执行redis-cli.exe来启动Redis命令行界面,进行操作和管理。此外,在Windows环境下,Redis可以作为后台服务运行,可以使用redis-server --service-install命令将Redis安装为Windows服务。 值得注意的是,Redis在Windows下默认是以单线程方式运行的,即每次只能处理一个请求,这会对性能造成影响。如果需要提高性能,可以使用集群部署多个Redis实例,并通过Redis Sentinel或Redis Cluster来管理这些实例。 总之,Redis-6.2.6适用于Windows操作系统,可以在Windows环境中使用Redis提供的功能和特性。需要注意的是,在Windows下使用Redis时需要特别留意性能方面的差异,并按照官方提供的方法正确安装和配置Redis服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值