转:http://www.javashuo.com/article/p-bzyaveid-ka.htmlhtml
Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是能够达到100000+的qps。这个数据不比采用单进程多线程的一样基于内存的KV数据库Memcached差。linux
Redis快的主要缘由是:redis
第1、二点不细讲,主要围绕第三点采用多路 I/O 复用技术来展开。数据库
多路 I/O 复用模型是利用select、poll、epoll能够同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,因而程序就会轮询一遍全部的流(epoll是只轮询那些真正发出了事件的流),而且只依次顺序的处理就绪的流,这种作法就避免了大量的无用操做。这里“多路”指的是多个网络链接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可让单个线程高效的处理多个链接请求(尽可能减小网络IO的时间消耗),且Redis在内存中操做数据的速度很是快(内存内的操做不会成为这里的性能瓶颈),主要以上两点造就了Redis具备很高的吞吐量。网络
和Memcached不一样,Redis并无直接使用Libevent,而是本身完成了一个很是轻量级的对select、epoll、evport、kqueue这些通用的接口的实现。在不一样的系统调用选用适合的接口,linux下默认是epoll。由于Libevent比较重更通用代码量也就很庞大,拥有不少Redis用不上的功能,Redis为了追求“轻巧”而且去除依赖,就选择本身去封装了一套。数据结构
☁ Redis为何会快?多线程
✎ 彻底基于内存架构
Redis是纯内存数据库,相对于读写磁盘,读写内存的速度就不是几倍几十倍了,通常,hash查找能够达到每秒百万次的数量级。并发
✎ 多路复用IO高并发
“多路”指的是多个网络链接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可让单个线程高效的处理多个链接请求(尽可能减小网络IO的时间消耗)。能够直接理解为:单线程的原子操做,避免上下文切换的时间和性能消耗;加上对内存中数据的处理速度,很天然的提升redis的吞吐量
Redis的高并发和快速缘由不少,总结一下几点:
1. Redis是纯内存数据库,通常都是简单的存取操做,线程占用的时间不少,时间的花费主要集中在IO上,因此读取速度快。
2. 再说一下IO,Redis使用的是非阻塞IO,IO多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减小了线程切换时上下文的切换和竞争。
3. Redis采用了单线程的模型,保证了每一个操做的原子性,也减小了线程的上下文切换和竞争。
4. 另外,数据结构也帮了很多忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
5. 还有一点,Redis采用本身实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。
最后,附两张图,让你们更加深入的理解Redis的架构和内存模型: