龙空技术网

单线程的Redis为什么轻松达到数万并发,记住这两点

沙茶敏碎碎念 9779

前言:

眼前朋友们对“redis的并发量是多少”大约比较关切,同学们都需要分析一些“redis的并发量是多少”的相关文章。那么小编在网上搜集了一些有关“redis的并发量是多少””的相关知识,希望兄弟们能喜欢,看官们快快来学习一下吧!

单机轻松10万QPS的Redis竟然是单线程的?!很多人都认为高并发就意味着多核心多进程,但这两者之间并没有特别大的联系。除了Redis之外,像Node.JS也是如此,那么为什么Redis能够如此之快呢?

首先,我们得了解下常见的网络模型,当客户端连接到服务器的时候,服务器有下面几个步骤:

从Socket中读取客户端传输过来的数据进行服务器相关逻辑的处理把数据写回到连接客户端的Socket当中

这就是我们常见的同步IO,这种IO方式存在什么问题呢?就是当从Socket中读取数据的时候,数据很有可能还没有从客户端传到服务端,那么这个线程就一直会在那边等,直到读到足够多的数据从客户端传上来,这个效率自然就高不上去。就好比一个人去钓鱼,一次只放一条鱼竿,然后守在旁边一直盯着这条鱼竿,直到鱼儿上钩再拉起来,中间做不了其他事情。

要提高机器的运行效率,我们有两件事情要做,一个是使用非阻塞IO,另一个是进行多路复用。

首先,什么是非阻塞IO呢?原本,我们从Socket读取数据的时候,约定读4kb,如果读取不够,就在那里傻等,现在变成了读取数据的时候,采用的是非阻塞的方法,如果读取不到4kb的数据,那么有多少就返回多少,等待下一次读取。就像刚刚钓鱼中的例子,原先我们是一直盯着鱼竿看,现在变成了我们看一下鱼竿,然后就可以低头玩手机,干其他事情。

其次是多路复用,既然我们不用死盯着一根鱼竿,为什么我们不一口气多开多几条鱼竿呢?等到鱼竿有动静了,再去看看。Redis亦是如此,在Redis中,采用到多路复用的技术,一个线程连接多个客户端。在Linux操作系统中,采用的是Epoll,一旦有Socket读写事件发生,Linux的内核会通知线程进行处理。

有了上述的异步IO与多路复用之后,Redis会维护一个指令队列,把从客户端中收到的指令放在队列当中。队列当中的指令会排队执行,进行客户端要求的各种操作。当Redis服务端完成任务之后,会将结果放入响应队列当中,等待恰当的时候,写给客户端。

正因为Redis是单线程的服务,所以Redis在使用的时候,要注意不要使用O(N)级别的指令,免得系统资源被占用,从而拖慢整个系统。

其实,说Redis是个单线程的服务也不太准确,在Redis的后台,进行定时任务处理、进行持久化的时候,是会通过其他线程进行处理的。

总结

Redis为什么单线程也能保持如此高的并发呢?最重要的亮点,就是异步IO与多路复用,记住了么?好了,我们就介绍到这里。欢迎大家关注我,近期还准备了一些AI相关的知识,整理后会和大家继续分享。大家的支持是我继续唠嗑的动力。同名公众号(沙茶敏碎碎念)

标签: #redis的并发量是多少