关于redis的几件小事(二)redis线程模型

1.memcached和redis有什么区别?

(1)Redis支持服务器端的数据操做
redis和memcached相比,redis拥有更多的 数据结构而且支持更丰富的数据操做 ,一般在memcached里面,你须要将数据拿到客户端来进行类型的修改而后在set回去,这样就严重增长了网络IO的次数和数据体积。在redis里面,这些操做能够在服务端完成,因此这些复杂的操做就和通常的GET/SET同样高效。因此,若是须要缓存能支持更复杂的结构和操做,那么redis是不错的选择 。
(2)内存使用率
若是使用简单的 key-value 存储的话,Memcached的内存利用率会更高,而若是Redis采用 hash 结构来作 key-value 存储,因为其组合式的压缩,其内存利用率会高于Memcached。
(3)性能
因为redis只使用单核,而Memcached可使用多核,因此平均每个核上redis在存储小数据时比Memcached性能更好。而在100K以上的数据中,Memcached性能要高于redis。
(4)集群模式
memcached没有原生的集群模式,须要依靠客户端来实现集群中分片写入数据;redis原生支持cluster模式,官方支持redis cluster集群模式。react

对比点 memcached redis
是否支持服务端操做 不支持 支持
数据结构类型 简单 复杂多样
内存使用率 简单 key-value 存储,利用率高 采用hash结构存储,内存利用率高
性能 存储大数据性能高 存储小数据性能高
集群模式 没有原生支持 原生支持cluster模式

2.redis的线程模式?

要了解redis的线程模式,必须先了解下面几个概念
(1)文件事件处理器
①redis是基于reactor模式开发了网络事件处理器,这个处理器叫作 文件事件处理器(file event Handler)。这个文件事件处理器是单线程的,因此redis才叫作单线程模式,采用IO多路复用机制去同时监听多个socket,根据socket上的事件来选择对应的事件处理器来处理这个事件。redis

②若是被监听的socket准备好执行accept、read、write、close等操做的时候,跟操做对应的文件事件就会产生,这个时候文件处理器就会调用以前关联好的的事件处理器来处理这个事件。缓存

③文件事件处理器是单线程模式运行的,可是经过IO多路复用机制监听多个socket,能够实现高性能的网络通讯模型,又能够跟内部其余单线程的模块进行对接,保证了redis内部的线程模型的简单性。服务器

④文件事件处理器的结构包含四个部分:多个socket、IO多路复用程序、文件事件分派器、事件处理器(命令请求处理器、命令回复处理器、链接应答处理器,等等)。网络

⑤多个socket可能并发的产生不一样的操做,每一个操做对应不一样的文件 事件,可是IO多路复用程序会监听多个socket,可是会将socket放到一个队列中去处理,每次从队列中取出一个socket给事件分派器,事件分派器把socket给对应的事件处理器。数据结构

⑥而后一个socket的事件处理完了以后,IO多路复用程序才会将队列中的下一个socket给事件分派器。事件分派器会根据每一个socket当前产生的事件,来选择对应的事件处理器来处理。多线程

(2)文件事件
①当socket变得可读时(好比客户端对redis执行write操做,或者close操做),或者有新的能够应答的socket出现时(客户端redis执行connect操做),socket就会产生一个AE_READABLE事件。并发

②当socket变得可写的时候(客户端对redis执行read操做),socket就会产生一个AE_WRITABLE事件。socket

③IO多路复用程序能够同时监听AE_READABLE和AE_WRITABLE两种事件,要是一个socket同时差生了这两种事件,那么文件分配器优先处理AE_READABLE事件,而后才是AE_WRITABLE事件。memcached

(3)文件事件处理器
若是是客户端要链接redis,那么会为socket关联链接应答处理器。
若是是客户端要写数据到redis,那么会为socket关联命令请求处理器。
若是是客户端要从redis读数据,那么会为socket关联命令回复处理器。

线程模型
(4)客户端与redis通讯的一次流程
①在redis启动初始化的时候,redis会将链接应答处理器跟AE_READABLE事件关联起来,接着若是一个客户端跟redis发起链接,此时redis会产生一个AE_READABLE事件,而后由链接应答处理器来处理跟客户端创建链接,建立客户端响应的socket,同时将这个socket的AE_READABLE事件跟命令请求处理器关联起来。

②当客户端向redis发起请求的时候(无论是读请求仍是写请求,都同样),首先就会在socket产生一个AE_READABLE事件,而后由对应的命令请求处理器来处理。这个命令请求处理器就会从socket中读取请求的相关数据,而后执行操做和处理。

③接着redis这边准备好了给客户端的响应数据以后,就会将socket的AE_WRITABLE事件跟命令回复处理器关联起来,当客户端这边准备好读取相应数据时,就会在socket上产生一个AE_WRITABLE事件,会由相应的命令回复处理器来处理,就是将准备好的响应数据写入socket,供客户端读取。

④命令回复处理器写完以后,就会删除这个socket的AE_WRITABLE事件和命令回复处理器的关联关系。

一次通讯过程

3.为何单线程redis还能够支撑高并发?

(1)纯内存操做。 (2)核心是基于非阻塞的IO多路复用机制 (3)单线程避免了多线程上下文切换的开销。

相关文章
相关标签/搜索