单机轻松10万QPS的redis竟然是单线程的?!很多人都认为高并发就意味着多核心多进程 , 但这两者之间并没有特别大的联系 。除了Redis之外 , 像Node.JS也是如此 , 那么为什么Redis能够如此之快呢?
文章插图
首先 , 我们得了解下常见的网络模型 , 当客户端连接到服务器的时候 , 服务器有下面几个步骤:
- 从Socket中读取客户端传输过来的数据
- 进行服务器相关逻辑的处理
- 把数据写回到连接客户端的Socket当中
要提高机器的运行效率 , 我们有两件事情要做 , 一个是使用非阻塞IO , 另一个是进行多路复用 。
首先 , 什么是非阻塞IO呢?原本 , 我们从Socket读取数据的时候 , 约定读4kb , 如果读取不够 , 就在那里傻等 , 现在变成了读取数据的时候 , 采用的是非阻塞的方法 , 如果读取不到4kb的数据 , 那么有多少就返回多少 , 等待下一次读取 。就像刚刚钓鱼中的例子 , 原先我们是一直盯着鱼竿看 , 现在变成了我们看一下鱼竿 , 然后就可以低头玩手机 , 干其他事情 。
其次是多路复用 , 既然我们不用死盯着一根鱼竿 , 为什么我们不一口气多开多几条鱼竿呢?等到鱼竿有动静了 , 再去看看 。Redis亦是如此 , 在Redis中 , 采用到多路复用的技术 , 一个线程连接多个客户端 。在linux操作系统中 , 采用的是Epoll , 一旦有Socket读写事件发生 , Linux的内核会通知线程进行处理 。
有了上述的异步IO与多路复用之后 , Redis会维护一个指令队列 , 把从客户端中收到的指令放在队列当中 。队列当中的指令会排队执行 , 进行客户端要求的各种操作 。当Redis服务端完成任务之后 , 会将结果放入响应队列当中 , 等待恰当的时候 , 写给客户端 。
正因为Redis是单线程的服务 , 所以Redis在使用的时候 , 要注意不要使用O(N)级别的指令 , 免得系统资源被占用 , 从而拖慢整个系统 。
其实 , 说Redis是个单线程的服务也不太准确 , 在Redis的后台 , 进行定时任务处理、进行持久化的时候 , 是会通过其他线程进行处理的 。
总结Redis为什么单线程也能保持如此高的并发呢?最重要的亮点 , 就是异步IO与多路复用 , 记住了么?
【单线程的Redis为什么轻松达到数万并发,记住这两点】
推荐阅读
- 文珠兰叶子发黄了该怎么补救的简单介绍
- 双十一严禁刷单炒信虚假评价是真的吗,双十一严禁先提价后打折可以举报吗
- 公务员、事业单位和个人退休金差距为什么这么大?网友:心塞了
- 凤凰单丛茶价格_单枞茶多少钱一斤?
- 穿衣搭配|53岁许晴美上“热搜”,穿一身白色简单高级,笑意盈盈美丽从容
- 抖音小店的销售量怎么刷 抖音小店怎么样爆单
- 简单函数与温度转换 业余码农成长记——Python学习4
- 含笑花怎么养的简单介绍
- 在树上怎么种植鸟巢蕨的简单介绍
- 减肥餐|减肥100天,裤子肥了:晒我的家常减肥餐,做法简单