一概述

Redis可以达到100000+的QPS(Query per second,每秒查询次数)。查看Redis源码可知,Redis是基于C语言实现的NoSQL数据库,绝大部分请求是存粹的内存操作,读写的时候不会受到磁盘读写I/O性能的限制。类似于HashMap,所以在Redis中查询和存储的时间复杂度均为O(1)。

二 Redis的底层数据结构

多线程 获取redis key 多线程读取redis队列_单线程

Redis中的5种数据类型分别为String,List,Hash,set,zset(有序集合),每种数据类型基于底层数据类型进行构造。

三 Redis的线程情况

Redis采用的是单线程模式,在处理高并发请求的时候一般会使用多线程,将I/O线程与业务线程进行分离,业务线程使用线程池,来避免频繁的创建和销毁线程,Redis的单线程结构是其主线程是单线程结构,其主线程包括I/O请求的处理与IO相关的请求处理,还包括过期键的处理,赋值,集群协调。除了I/O事件的逻辑,会被封装成周期性的任务有主线周期性的处理。

因为Redis采用的是单线程设计,所以所有的业务请求都会通过一个主线程进行串行处理,使得多个客户端对于一个键进行读写操作都不会出现并发问题。同时避免上下文的切换,避免了锁的竞争,使得Redis的使用效率更高。

Redis使用单线程通过I/O多路复用技术,通过非阻塞式I/O,在RedisQPS很高的时候,CPU很大程度不会达到阈值,很多是由于网络问题导致并发处理无法达到理想的状态,也就是CPU往往不是制约Redis性能的最大瓶颈。

Redis在多核的服务器中,启动多个Redis实例,利用多核的性质,单线程往往是指我们在处理网络请求的时候是由单线程进行处理,一个Redis Server在处理请求的时候,会根据实际情况,以子线程进行处理。

Redis是运行在单线程中,所有的处理都是按照顺序线性执行,但是用户的输入和输出操作阻塞式的,此时无法保证某个处理的直接返回,导致I/O阻塞,进而导致整个进程无法对其他请求提供服务,从而出现I/O多路复用。