精华内容
下载资源
问答
  • redis 单线程,避免了线程切换、加锁等资源消耗,redis内存处理比较快 多路io复用,多个socket链接复用, 使用同一个线程处理 使用epoll策略,实现哪些socket有通讯,处理那些socket、 高效 转载于:...
    redis 单线程,避免了线程切换、加锁等资源消耗,redis内存处理比较快
    多路io复用,多个socket链接复用, 使用同一个线程处理
    使用epoll策略,实现哪些socket有通讯,处理那些socket、 高效

    转载于:https://www.cnblogs.com/chenge-0401/p/10491178.html

    展开全文
  • Redis 单线程和IO复用

    2020-10-14 23:33:33
    Redis是基于单线程实现,但是速度却不慢,原因有二: ...说白了,redis依赖于C语言提供的函数库,通过对IO多路复用的函数库进行封装,根据自身需要提供IO复用技术; 并且redis会依据不同平台而设置不同的使用机制.

    Redis是基于单线程实现,但是速度却不慢,原因有二:

     

    1)基于内存运行机制,单线程降低了cpu内核资源的使用压力;

    2)Redis会根据不同的系统使用了I/O复用机制;

    redis的I/O复用是redis依赖设备平台提供的机制,redis会使用一些C语言提供的函数库,这些函数库能为redis选择当前系统版本最优秀的I/O复用技术。说白了,redis依赖于C语言提供的函数库,通过对IO多路复用的函数库进行封装,根据自身需要提供IO复用技术;

    并且redis会依据不同平台而设置不同的使用机制,体现到代码实现里面来,就是定义不同的宏文件,在引入头文件即可。例如在linux中会使用epoll。

     

    epoll是linux内核一个可扩展的I/O处理机制,工作顺序简单概述:

    1)接收到链接请求,给链接建立一个文件描述符(linux把所有设备看作是文件);

    2)对文件描述符添加自定义的监听事件(例如,redis可以指定read和write的监听);

    3)当监听事件被触发(请求已经就绪,完成登录、安全校验等前置步骤),监听器把事件加入处理队列,并告知应用程序;

    4)应用程序遍历待处理的文件句柄,异步处理,完成后返回响应;

    截取博客较好的代码实现:(转载:https://blog.csdn.net/qq_19923217/article/details/81943705

    static void do_epoll(int listenfd)
    {
        int epollfd;
        struct epoll_event events[EPOLLEVENTS];
        int ret;
        char buf[MAXSIZE];
        memset(buf,0,MAXSIZE);
        //创建一个描述符
        epollfd = epoll_create(FDSIZE);
        //添加监听描述符事件
        add_event(epollfd,listenfd,EPOLLIN);
        for ( ; ; )
        {
            //获取已经准备好的描述符事件
            ret = epoll_wait(epollfd,events,EPOLLEVENTS,-1);
            handle_events(epollfd,events,ret,listenfd,buf);
        }
        //文件描述符会占用内存空间,处理完成后需要释放
        close(epollfd);
    }
    
    static void handle_events(int epollfd,struct epoll_event *events,int num,int listenfd,char *buf)
    {
        int i;
        int fd;
        //进行选好遍历
        for (i = 0;i < num;i++)
        {
            fd = events[i].data.fd;
            //根据描述符的类型和事件类型进行处理
            if ((fd == listenfd) &&(events[i].events & EPOLLIN))
                handle_accpet(epollfd,listenfd);
            else if (events[i].events & EPOLLIN)
                do_read(epollfd,fd,buf);
            else if (events[i].events & EPOLLOUT)
                do_write(epollfd,fd,buf);
        }
    }
    
    static void do_read(int epollfd,int fd,char *buf)
    {
        int nread;
        nread = read(fd,buf,MAXSIZE);
        if (nread == -1)
        {
            perror("read error:");
            close(fd);
            delete_event(epollfd,fd,EPOLLIN);
        }
        else if (nread == 0)
        {
            fprintf(stderr,"client close.\n");
            close(fd);
            delete_event(epollfd,fd,EPOLLIN);
        }
        else
        {
            printf("read message is : %s",buf);
            //修改描述符对应的事件,由读改为写
            modify_event(epollfd,fd,EPOLLOUT);
        }
    }

     

     

     

     

    展开全文
  • redis单线程: redis是以socket方式通信,socket服务端可同时接受个客户端请求连接,也就是说,redis服务同时面对个redis客户端连接请求,而redis服务本身是单线程运行。 假设,现在有A,B,C,D,E五个客户端...

    https://www.cnblogs.com/myseries/p/11733861.html

    redis单线程:

    redis是以socket方式通信,socket服务端可同时接受多个客户端请求连接,也就是说,redis服务同时面对多个redis客户端连接请求,而redis服务本身是单线程运行。

            假设,现在有A,B,C,D,E五个客户端同时发起redis请求,A优先稍微一点点第一个到达,然后是B,C,D,E依次到达,此时redis服务端开始处理A请求,建立连接需要30秒,获取请求数据需要10秒,然后处理数据需要0.1秒,回送数据给客户端需要5秒,总共大概需要45秒。也就是说,下一个B请求需要等待45秒,这里注意,也许这五个几乎同时请求,由于socket可以同时处理多个请求,所以建立网络连接阶段时间差可忽略,但是在第二阶段,服务端需要什么事都不干,坐等10秒中,对于CPU和客户端来说是无法忍受的。所以说单线程效率非常,非常低,但是正是因为这些类似问题,Redis单线程本质上并不是如此运行。接下来讨论redis真正的单线程运行方式。

            客户端与服务端建立连接交由socket,可以同时建立多个连接(这里应该是多线程/多进程),建立的连接redis是知道的(为什么知道,去看socket编程,再次强调基础很重要),然后redis会基于这些建立的连接去探测哪个连接已经接收完了客户端的请求数据(注意:不是探测哪个连接建立好了,而是探测哪个接收完了请求数据),而且这里的探测动作就是单线程的开始,一旦探测到则基于接收到的数据开始数据处理阶段,然后返回数据,再继续探测下一个已经接收完请求数据的网络连接。注意,从探测到数据处理再到数据返回,全程单线程。这应该就是所谓的redis单线程。

    redis I/O多路复用:

    这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。

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

    举个例子:假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确

    站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。
    这种就是IO复用模型,Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式

     

    https://blog.csdn.net/qq_29066329/article/details/96284790

    为什么Redis单线程模型效率这么高?

    1.基于非阻塞IO的多路复用

    2.基于内存操作

    3.单线程避免了线程之间的上下文切换

    展开全文
  • Redis使用单线程,可以避免上下文切换,效率最高。避免了线程切换、加锁等资源消耗 IO多路复用指多个channel或者网络IO,共用一个或者少量线程来处理。 为什么使用多路复用,是因为与用户网络传输是需要等待的,IO...

    Redis使用单线程,可以避免上下文切换,效率最高。避免了线程切换、加锁等资源消耗

    单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。

    IO多路复用指多个channel或者网络IO,共用一个或者少量线程来处理。

    为什么使用多路复用,是因为与用户网络传输是需要等待的,IO操作不能直接返回。所以使用IO多路复用来解决这个问题,防止一个IO阻塞影响其他IO的读取。

    文件事件处理器使用IO多路复用模块同时监听多个FD(文件描述符),有读写accept和close事件时,回调绑定的事件处理器。
    使用epoll策略,实现哪些socket有通讯,处理那些socket、 高效

    使用redis的好处:

    1. 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
    2. 支持丰富数据类型,支持string,list,set,sorted set,hash
    3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
    4. 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

    redis的value最大可以达到1GB,key最大是512M

    Redis常见性能问题和解决方案:
    1、一般不在master上做持久化工作,因为写内存快照时,会阻塞主线程工作,可能导致间歇性暂停服务。
    2、主从复制使用单向链表结构,更稳定。

    展开全文
  • 文章目录 redis单线程执行却快的原因(IO多路复用
  • 它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。 Redis 不仅仅是单线程 一般来说 Redis 的瓶颈并不在 CPU,...
  • redis的io多路复用技术

    2021-03-21 21:02:40
    redis单线程为什么会那么快? 主要有两点: 1.内存操作 2.io多路复用技术 什么是io多路复用? 一、简单理解就是:一个服务端进程可以同时处理多个套接字描述符。 多路:多个客户端连接(连接就是套接字描述符) 复用...
  • 1.单线程模型 Redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求; 其他模块该使用多线程,仍会使用了多个线程。...它采用 IO 多路复用机制同时监听多个 Socket,并把所有
  • 单线程多路复用和多线程加锁的区别 unix   linux   c   golang   Deen  2015年11月21日提问 关注  9  关注 收藏  1  收藏, 776  浏览 问题对人有帮助,内容...
  • Redis是一个性能很好的缓存数据库但实际上它是一个单线程的,主要是其采用IO多路复用来保证在有多个连接的时候系统也有很高的吞吐量。 Redis中为什么要使用IO多路复用??? 首先是redis单线程的所有的操作都是...
  • redis单线程,线程安全 ...(3) 非阻塞IO - IO多路复用(IO 多路复用是什么意思?) IO多路复用中有三种方式:select,poll,epoll。需要注意的是,select,poll是线程不安全的,epoll是线程安全的 redis内部...
  • Redis 和 IO 多路复用

    千次阅读 2018-07-30 23:11:16
    最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进行简单的整理。 几种 I/O ...
  • 这个文件事件处理器是单线程的,所以redis才叫单线程模型,采用IO多路复用技术同时监听多个socket,根据socket上的事件来选择对应的事件处理器来处理事件. ①.在Redis启动及初始化的时候,Redis会(预先)将连接应答...
  • Redis 线程模型:https://www.jianshu.com/p/8f2fb61097b8 ... redis 内部使用文件事件...它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。 文件事件处理器的结构包
  • Redis-IO多路复用

    2020-04-19 23:17:06
    2、I/O多路复用,即:I/O multiplexing,这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流。发明它的原因,是尽量多的提高服务器的吞吐能力; 3、可以理解成是一...
  • redis单线程

    2021-03-03 12:50:16
    redis单线程问题: https://www.jianshu.com/p/1817a38cc363 Redis 确实是单线程模型,指的是执行 Redis 命令的核心模块是单线程的,而不是整个 Redis 实例就一个线程,Redis 其他模块还有各自模块的线程的。 Redis...
  • Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户...
  • 多路复用指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就位,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一...
  • Redis是跑在单线程的,所有的操作都是按顺序线性执行的,由于读写操作需要等待用户输入或者输出是阻塞的,所以某一个文件I/O阻塞会导致整个进程无法对其他客户提供服务,I/O多路复用就是为了解决这个问题而出现的。...
  • IO多线程 刚开始看到Redis支持多线程的时候,其实自身心里挺疑惑的,Redis难道是单线程?...原来Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务,只所以快可归结一下几点: 1、完全基
  • 的机器会连redis,请求到达内核后会形成fd。 redis是一个进程可以调用epoll来遍历fd观察数据到达的情况进行消费。...单线程就表明redis在处理数据时是有“顺序性”的。但是这个顺序性只保证每...
  • Redis单线程为什么还能这么快? 因为它的所有数据都在内存中,所有的运算都是内存级别的运算。正因为Redis是单线程,所以要小心使用Redis指令,对于那些时间复杂度为O(n)级别的指令,一定要谨慎使用,否则一不小心...
  • Redis单线程是否真的是单线程?为什么要采用单线程设计? Redis 单线程为什么快 Redis 中事件驱动的实现
  • 最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进行简单的整理。 几种 I/O 模型 ...
  • Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户...
  • 作者:Draveness原文:draveness.me/redis-io-multiplexing推荐阅读最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净...
  • 1:io多路复用epoll io多路复用简单来说就是一个线程处理多个网络请求。我们知道epoll in 的事件触发是可读了,这个比较好理解,比如一个连接过来,或者一个数据发送过来了,那么in事件就触发了,那么out事件是如何...
  • Redis单线程模型

    2020-10-30 21:38:26
    Redis单线程下还可以支持高并发的一个重要原因就是 Redis 的线程模型:基于非阻塞的IO多路复用机制。Redis 的线程模型详细说明如下: 客户端与redis交互的完整流程: Redis 启动初始化的时候,Redis 会将连接...
  • 我们通常所说的Redis单线程是指获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这个主线程就是我们平时说的"单线程",而其他的清理脏数据、无用连接的释放、LRU淘汰策略等等...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,238
精华内容 495
热门标签
关键字:

redis单线程多路复用

redis 订阅