首先说下原因:
1.redis是基于内存的,内存的读写速度非常快;
2.redis是单线程的,省去了很多上下文切换线程的时间;
3.redis使用多路复用技术,可以处理并发的连接;
简单解释下第二条:上下文切换就是cpu在多线程之间进行轮流执行(抢占cpu资源),而redis单线程的,因此避免了繁琐的多线程上下文切换。
重点解释下多路复用:
多路-指的是多个socket连接,复用-指的是复用一个线程。
目前,多路复用主要有三种技术:select,poll,epoll。它们出现的顺序是按时间先后的,越排后的技术改正了之前技术的缺点。epoll是最新的也是目前最好的多路复用技术。
举个例子:一个酒吧服务员,前面有很多醉汉,epoll这种方式相当于一个醉汉吼了一声要酒,服务员听见之后就去给他倒酒,而在这些醉汉没有要求的时候服务员可以玩玩手机干点别的。但是select和poll技术是这样的场景:服务员轮流着问各个醉汉要不要倒酒,没有空闲的时间。io多路复用的意思就是多个醉汉共用一个服务员。
select:
1.会修改传入的参数,对于多个调用的函数来说非常不友好;
2.要是sock(io流出现了数据),select只能轮询这去找数据,对于大量的sock来说开销很大;
3.不是线程安全的,很恐怖;
4.只能监视1024个连接;poll:
1.还不是线程安全的...
2.去掉了1024个连接的限制;
3.不修改传入的参数了;epoll:
1.线程安全了;
2.epoll不仅能告诉你sock有数据,还能告诉你哪个sock有数据,不用轮询了;
3.however,只支持linux系统;
IO多路复用原理和异步io的原理请参照【https://blog.csdn.net/happy_wu/article/details/80052617】,写的真的非常好。