今天我在一个技术群里提出一个问题:Redis为什么这么快,Redis的那些特性能够支持了它的高并发?
之前的我,也只是知道Redis是内存数据库,所以读取速度快;IO使用的是多路复用,使用一个线程来轮询描述符,减少了线程上下文的切换,将数据库的开、关、读、写都转化成了时间,所以IO时也有加速。虽然理解上就是这些(当然还有一些数据结构的原因,全程使用hash结构,加速读写)
突然想写下来,供大家看一下,也想请大神批评指正一下。
Redis的高并发和快速原因很多,总结一下几点:
1. Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快。
2. 再说一下IO,Redis使用的是非阻塞IO,IO多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。
3. Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。
4. 另外,数据结构也帮了不少忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
5. 还有一点,Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。
最后,附两张图,让大家更加深刻的理解Redis的架构和内存模型:
Redis的工作流程图