资讯专栏INFORMATION COLUMN

Redis 系列之一

chengjianhua / 765人阅读

摘要:这个文件事件处理器是单线程的,所以叫做单线程模型,采用多路复用机制同时监听多个,根据上的事件来选择对应的事件处理器处理这个事件。

为什么使用缓存

优点:

高性能

高并发
MySQL天然对高并发不好,MySQL单机支撑2000qps也开始容易报警,可以使用缓存,让数据查询从缓存中拿出数据

缺点:

缓存的数据和数据库的数据不一致

缓存雪崩

缓存穿透

缓存并发竞争

redis 和memcached 的区别

Redis支持服务端的操作:Redis相比memcache来说,有更多的数据结构和并支持更丰富的数据操作

memcache没有原生的集群模式,需要依赖客户端来实现往集群中分片写入数据,但是Redis支持原生的cluster模式,支持集群模式。

Redis 的线程模型

Redis是基于reactor模式开发的网络事件处理器,这个处理器叫做文件事件处理器,file event handler。这个文件事件处理器是单线程的,所以Redis叫做单线程模型,采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器处理这个事件。
如果被监听的scoket准备好执行accept,read,write,close等操作的时候,跟操作对应的文件事件就会产生,这个时候文件事件处理器就会调用和之前相关的事件处理器处理这些事件。
文件事件处理器是单线程的,但是可以通过IO多路复用机制监听多个socket,可以实现高性能的网络通信,有可以和内部的其他线程某块进行对接,保证了Redis内部的线程模型的简单性。
文件事件处理器包括4个部分,即多个socket,IO多路复用程序,文件事件分派器,事件处理器(命令请求处理器,命令回复处理器,连接应答处理器等)
连接应答处理器:将事件如AE—READERABLE事件和命令请求处理器相关联。
命令请求处理器:将请求指令中的数据读出key和value,然后完成key和value的设置。
命令回复处理器:对本次的操作输出一个结果。
多个socket可能并发的产生不同的操作,每一个操作对应一个不同的文件事件,但是IO多路复用程序会监听多个socket,会将多个socket放入一个对列中进行排队,每一次从排队中拿出一个socket给事件分派器,事件分派器把socket给对应的事件处理器。

文件事件
当socket变得可读的时候(如客户端对Redis进行write操作的时候,或者close操作的时候),socket就会产生一个AE—READBLE事件,当socket变得可写的时候(客户端对Redis进行read操作),socket会产生一个AE-WRITEABLE事件,IO多路复用程序可以同时监听AE-WRITE和AE-READE两种事件,那么文件事件派发器会优先处理AE-READBLE事件,然后处理AE—WRITE事件。

文件事件处理器

如果时客户端要连接Redis,那么会为socket关联连接应答处理器
如果客户端要写数据到Redis,那么会为scoket关联命令请求处理器
如果客户端要从Redis读取数据,那么会为socket关联命令回复处理器

客户端与Redis通信的一次流程

在Redis启动初始化的时候,Redis会将连接应答处理器和AE-READABLE事件关联在一起,接着如果客户端跟Redis发起连接,此时会产生一个AE-READBLE事件,然后由连接应答处理器来处理和客户端建立连接,创建客户端对应的socket,同时将这个socket的AE-READBLE事件跟命令请求处理器关联起来。

当客户端向Redis发起请求的时候,(不管是读或者是写的请求),首先就会在socket产生一个AE-READBLE事件,然后由对应的命令请求处理器来处理,这个命令请求处理器就会从socket中读取相关数据,然后进行执行和处理。

接着Redis这边准备好了给客户端的响应数据之后,就会将socket的AE-WRITEABLE事件跟命令回复处理器关联起来,当客户端这边准备好读取响应数据的时候,就会产生一个AE-WRITEABLE事件,会有对应的命令回复处理器来处理,这就是将准备好的响应数据写入socket,供客户端读取。

命令回复处理器写完之后,就会删除这个socket的AE-WRITEABLE事件和命令回复处理器的关联关系。

为什么Redis是单线程模型也能效率那么高
(1) 纯内存操作
(2) 核心是非阻塞的IO多路复用机制
(3) 单线程反而避免了多线程的频繁上线文切换问题

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69752.html

相关文章

  • 用Go实现Redis之一准备工作

    摘要:命令实现命令是最常用的命令之一,也是最能反映缓存发展历史的操作。命令在客户端接收之后,经由协议转换传递给服务端执行。服务端执行命令前先查询是否支持该命令,以决定是否执行。,是的简称,代表的是只存增量的持久化方式。 缘起 最近公司的第一个PHP转GO项目已经在生产环境稳定运行数周,又逢需求小年儿,最近可以得空分享下去年学GO过程中的练手项目Godis——用Golang实现的Redis. ...

    zhangke3016 评论0 收藏0
  • Docker Swarm系列第二部:重新调度Redis

    摘要:今天,我们将关注如何部署容器并测试当前实验性重新调度功能的当前状态。注意重新调度尚处于实验阶段,其中存在。但也确实有部分用户指出重新调度机制并未生效,或者是在主机恢复后出现了两套容器。 欢迎回来,我们继续本系列的第二篇教程。今天我们将主要关注Redis,希望大家还记得第一部分的主要内容——了解如何安装我们将要使用的环境。 传送门: Docker Swarm系列第一部:利用Floc...

    陆斌 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<