redis底层是单线程

一直有个错觉就是,redis底层命令是并发执行的,但今天查看若干资料后发现,redis底层是单线程的,也就是说多客户端向redis服务器发送操作命令,redis底层是串行执行的,这样不禁怀疑这样不是很慢吗?后经过进一步探究,得出结论: 
1 单线程并不一定比多线程慢,多线程需要不停切换上下文,本身就有性能损失 
2 内存型数据库的瓶颈在IO,因为其数据本身就是在内存里面,不需要频繁的与磁盘做交互,IO主要在接收请求和响应结果上,redis采用Linux的epoll机制,epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

所以redis快在与基于内存 , IO采用异步非阻塞epoll机制

1 单线程模型

Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。

2 单线程模型每秒万级别处理能力的原因

(1)纯内存访问。数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。

(2)非阻塞I/O,Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了时间,不在I/O上浪费过多的时间。

(3)单线程避免了线程切换和竞态产生的消耗。

(4)Redis采用单线程模型,每条命令执行如果占用大量时间,会造成其他线程阻塞,对于Redis这种高性能服务是致命的,所以Redis是面向高速执行的数据库。

猜你喜欢

转载自blog.csdn.net/luzhensmart/article/details/86520120