zoukankan      html  css  js  c++  java
  • redis 为什么能支持高并发略解

    身在福中不知福是什么?就是发福快发成猪了,还觉得自己身材蛮OK

    很多时候,别人会问redis 为什么能支持十几万的请求,我们一般都是知其然而不知所以然,下面就带大家粗略了解一下

    1、纯内存K-V操作

    数据库的工作模式按存储方式分为了磁盘数据库和内存数据库。Redis将数据存储在内存中,并且绝大多数命令都不会受到磁盘 IO 速度的限制,所以速度极快。此外,Redis内部采用了 HashMap 这种数据结构,从根本上获得了优势,因为 HashMap 无论是查找和操作的时间复杂度都是O(1);

    2、采用了多路复用的I/O机制

    Redis是单线程的,但它底层使用了多路复用 I/O 机制。多路 /O 复用模型是指利用select、poll、epoll 同时监察多个流的 I/O 事件,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒。程序会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法避免了大量的无用操作。

    3、数据结构简单,操作节省时间

    Redis对数据结构做了很多优化,诸如压缩表、对短数据进行压缩存储、跳表等,都加快了读取速度

    4、redis 是单线程的,这一点毋庸置疑(注意,Redis 6.0 网络读写部分是多线程的)

    注意:Redis 的瓶颈并不在线程,也不在获取CPU资源,而往往是网络带宽和计算机的内存大小,这也就是 Redis 使用单线程的原因;

    单线程的优点:

    1. 省去上下文切换:上下文不难理解,就是CPU寄存器和程序计数器。主要作用就是存放没有被分配到资源的线程,多线程操作的时候,不是每一个线程都能够直接获取到CPU资源的,我们之所以能够看到我们电脑上能够运行很多的程序,是应为多线程的执行和CPU不断对多线程的切换。但是总有线程获取到资源,也总有线程需要等待获取资源,这个时候,等待获取资源的线程就需要被挂起,也就是我们的寄存。这个时候我们的上下文就产生了,当我们的上下文再次被唤起,得到资源的时候,就是我们上下文的切换;
    2. 避免竞争资源:竞争资源相对来说比较好理解,CPU对上下文的切换其实就是一种资源分批,但是在切换之前,到底切换到哪一个上下文,就是资源竞争的开始。在 Redis 中由于是单线程的,所以所有的操作都不会涉及到资源的竞争;
    3. 避免锁的消耗:对于多线程的来讲,不能回避的就是锁的问题。如果说多线程操作出现并发,有可能导致数据不一致,或者操作达不到预期的效果。这个时候我们就需要锁来解决这些问题。当我们的线程很多的时候,就需要不断的加锁,释放锁,该操作就会消耗掉很多的时间;

    如果想了解更多的知识,请查阅其他资料

  • 相关阅读:
    C# 图片与Base64的相互转化
    LeetCode 303. Range Sum Query – Immutable
    LeetCode 300. Longest Increasing Subsequence
    LeetCode 292. Nim Game
    LeetCode 283. Move Zeroes
    LeetCode 279. Perfect Squares
    LeetCode 268. Missing Number
    LeetCode 264. Ugly Number II
    LeetCode 258. Add Digits
    LeetCode 257. Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/fangdada/p/15092716.html
Copyright © 2011-2022 走看看