Redis的单线程模型:
说Rsdis是单线程模型,不是Redis服务器内部真的就只有一个线程在工作,还有别的线程在处理网络IO等工作。只是有一个核心的线程在处理所有的命令请求。
这里还要再强调一下Redis是客户端/服务器架构的程序。
在对多线程中,我们要考虑线程安全问题:比如两个线程同时对一个进行自增操作,最终的结果可能是只自增了一次。Redis服务器在同一时刻会接收到很多客户端的请求,会不会也出现类似的问题呢?答案是并没有。
因为Redis在处理命令请求的时候是单线程模型,保证了收到多个的多个请求是串行执行的。多个命令请求到达Redis服务器是在队列中排队的,在等待Redis服务器一个一个的取出命令在执行,微观上讲Redis服务器是串行/顺序执行这个多个命令的,不会产生线程安全问题。
Redis能够使用单线程模型很好的去工作,是因为它的业务都是直接去操作内存的短平快的不太消耗CPU资源的操作,随之而来弊端就是,要特别小心某个命令执行时间不能太长,这样会阻塞其他的命令。
Redis为什么这么快?
没有对比就没有伤害,Redis的快是相对于数据库来说的;(MySQL、oracle、sql server)
- Redis将数据以键值对的形式存储到内存,而数据库是将数据存储到硬盘的,所以速度较快
- Redis的核心功能都是比较短平快的操作,数据库查询等操作相对复杂势必会有更多的开销
- 单线程模型,避免了一些不必要的线程竞争产生的开销。因为Redis处理的都是短平快,不是特别消耗CPU的操作,因此没有什么必要引入多线程去提高效率。
- 网络处理的时候,使用了epoll这样的IO多路复用机制。
浅谈IO多路复用机制:
IO多路复用机制就是一个线程管理多个socket,针对TCP来说,服务器这边每服务一个客户端都会给这个客户端安排一个socket。一个服务器服务多个客户端就会有多个socket,但是这些socket并非同时活跃,这么多socket大部分时间都是静默的。这样的话就可尝试用一个线程去管理多个socket。比如室友四个人去小吃街买饭:
多线程:每个人去不同摊位买自己的饭就相当于同时开了四个线程,系统资源开销比较大但效率很高,买四份饭只需要花做一份饭的时间。
单线程:一个人分别去四个摊位买饭等待做饭,虽然系统开销小,但是需要花费做四份饭的时间
IO多路复用机制:也是相当于一个人买饭,但是这个人不会在摊位上瞎等,而是等待的过程中去买另外几份饭,那个老板做好了,喊同学一声,同学就过去拿饭。相当于一个线程管理多个socket,一定程度上提高效率,节省系统资源开销。