zoukankan      html  css  js  c++  java
  • 【Redis】为什么通常说Redis是单线程的?并且Redis为什么这么快!

    • 多线程有什么好处呢?使用多线程它不香么?
    对于单纯的网络IO来说,当请求量达到一定程度之后,多线程的确会有很大的优势,
    
    不过并不是单纯的多线程,而是每个线程都有自己的多路复用模型(如:select、poll、epoll)
    
    也就是多线程和多路复用模型混合。
    • 那Redis为什么是单线程的呢?(这里指Redis4.0版本之前)
    但是我们还要考虑Redis操作的对象,毕竟Redis是直接操作内存中的数据结构,
    
    如果是多线程操作的话,那就需要为这些对象加锁。虽然多线程的效率提高,但是每个线程的程序效率严重下降,
    
    并且程序逻辑也会更复杂。

    敲黑板!!!此处需要墙裂补充一下:

    1》我们一直强调的单线程,只是在处理网络请求的时候只有一个线程来处理,
    
    一个正式的Redis-Server运行的时候肯定不止一个单线程,例如在Redis进行持久化的时候,
    
    以子进程或子线程的方式进行。
    
    
    
    2》Redis在4.0版本后开始会支持多线程的操作,所以本文仅适合Redis4.0版本前。

    我们用【strace】指令获取一下启动后的线程情况:

    [root@bogon data]# strace -ff -o /root/data/redis-thread-group/ooxx systemctl start redis

    可以看到一共有6个线程情况,足以说明redis-server内部处理时非单线程

    • 那Redis为什么这么快呢?

    1》Redis完全基于内存,大部分请求是纯内存操作,非常快速。

    数据在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都为O(1);

    2》采用单线程,减少了线程上线文切换和资源竞争,从而也就减少了对CPU性能上的开销。

    也不存在加锁和释放锁操作,从而也减少了各种锁机制的性能消耗。

    3》网络请求上使用多路I/O复用模型,即一种非阻塞I/O。

    此处【多路】指的是多个网络连接,【复用】指的是复用同一个线程。

    采用多路I/O复用技术,可以让单个线程更高效的处理多个连接请求,

    从而减少网络I/O时间上的消耗。

    4》数据结构简单,对数据操作也简单。

    Redis中的数据结构是单独设计的。

  • 相关阅读:
    新零售的舞台上,创业者如何与大象共舞
    无人零售的黑科技:RFID技术
    中台服务架构的一点思考
    大中台+小前台概念
    如何根据对象的属性,对集合(list / set)中的对象进行排序
    fzu 1075 分解素因子
    POJ 1442 Black Box(优先队列)
    Linux正則表達式-定位元字符
    排序算法之希尔排序
    人工神经网络简单介绍
  • 原文地址:https://www.cnblogs.com/boluopabo/p/13042834.html
Copyright © 2011-2022 走看看