zoukankan      html  css  js  c++  java
  • Redis为什么这么快

    今天我在一个技术群里提出一个问题:Redis为什么这么快,Redis的那些特性能够支持了它的高并发?

    之前的我,也只是知道Redis是内存数据库,所以读取速度快;IO使用的是多路复用,使用一个线程来轮询描述符,减少了线程上下文的切换,将数据库的开、关、读、写都转化成了时间,所以IO时也有加速。虽然理解上就是这些(当然还有一些数据结构的原因,全程使用hash结构,加速读写)

        突然想写下来,供大家看一下,也想请大神批评指正一下。

        Redis的高并发和快速原因很多,总结一下几点:

            1. Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快。

            2. 再说一下IO,Redis使用的是非阻塞IO,IO多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。

            3. Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。

            4. 另外,数据结构也帮了不少忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。

            5. 还有一点,Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。

         最后,附两张图,让大家更加深刻的理解Redis的架构和内存模型:

                   

                          

                                              Redis的工作流程图

    完全基于内存

          Redis是纯内存数据库,相对于读写磁盘,读写内存的速度就不是几倍几十倍了,一般,hash查找可以达到每秒百万次的数量级。

    多路复用IO

          “多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)。可以直接理解为:单线程的原子操作,避免上下文切换的时间和性能消耗;加上对内存中数据的处理速度,很自然的提高redis的吞吐量。

  • 相关阅读:
    spring 定时任务 taskScheduler详解
    shiro.ini 配置详解
    nginx : server_name localhost 和 chrome : Provisional headers are shown
    参数文件管理
    归档日志管理
    日志文件管理
    控制文件管理
    数据文件管理
    OGG配置参数样例
    OGG配置案例一(源表与目标表结构一致)
  • 原文地址:https://www.cnblogs.com/zuiaijiapei/p/8191402.html
Copyright © 2011-2022 走看看