likes
comments
collection
share

Redis6系列13-Redis为什么这么快?

作者站长头像
站长
· 阅读数 20

欢迎大家关注 github.com/hsfxuebao ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈

1. Redis快的原因

1.1 内存操作

我们都知道内存读写是比磁盘读写快很多的。Redis是基于内存存储实现的数据库,相对于数据存在磁盘的数据库,就省去磁盘磁盘I/O的消耗。MySQL等磁盘数据库,需要建立索引来加快查询效率,而Redis数据存放在内存,直接操作内存,所以就很快。

1.2 高效底层数据结构

Redis 的底层数据结构一共有6种,分别是,简单动态字符串(SDS),快速列表(quicklist),压缩列表(ziplist),哈希表(hashtable),跳表(skiplist)和整数数组(intset)。如果对这块不是很清楚,可参考Redis6系列文章

1.3 线程模型

1.3.1 单线程VS多线程

参见文章# Redis6系列1-线程模型(单线程OR多线程)

1.3.2 上下文切换

因为是单线程模型,就可以避免不必要的上先文切换和多线程竞争,这样可以省去多线程切换带来的时间和性能上的消耗,而且单线程不会导致死锁问题的发生

1.4 IO模型

详见:# IO系列3-详解IO多路复用(select、poll、epoll)

1.4.1 文件事件处理器

Redis 服务采用 Reactor 的方式来实现文件事件处理器(每一个网络连接其实都对应一个文件描述符)。Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。 它的组成结构为4部分: 

  • 多个套接字 

  • IO多路复用程序

  • 文件事件分派器 

  • 事件处理器。 因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型,如下图: Redis6系列13-Redis为什么这么快?

文件事件是对套接字操作的抽象,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。因为一个服务器通常会连接多个套接字,所以多个文件事件有可能会并发地出现。I/O 多路复用程序负责监听多个套接字,并向文件事件分派器传送那些产生了事件的套接字。

连接应答处理器

networking.c/acceptTcpHandler函数是Redis的连接应答处理器,这个处理器用于对连接服务器监听套接字的客户端进行应答,具体实现为sys/socket.h/acccept函数的包装。

当Redis服务器进行初始化的时候,程序会将这个连接应答处理器和服务器监听套接字的AE_READABLE时间关联起来,当有客户端用sys/socket.h/connect函数连接服务器监听套接字的时候,套接字就会产生AE_READABLE事件,引发连接应答处理器执行,并执行相应的套接字应答操作。

Redis6系列13-Redis为什么这么快?

命令请求处理器

networking.c/readQueryFromClient函数是Redis的命令请求处理器,这个处理器负责从套接字中读入客户端发送的命令请求内容,具体实现为unistd.h/read函数的包装。

当一个客户端通过连接应答处理器成功连接到服务器之后,服务器会将客户端套接字的AE_READABLE事件和命令请求处理器关联起来,当客户端向服务器发送命令请求的时候,套接字就会产生AE_READABLE事件,引发命令请求处理器执行,并执行相应的套接字读入操作。

在客户端连接服务器的整个过程中,服务器都会一直为客户端套接字AE_READABLE事件关联命令请求处理器。

Redis6系列13-Redis为什么这么快?

命令回复处理器

networking.c/sendReplyToClient函数是Redis的命令回复处理器,这个处理器负责从服务器执行命令后得到的命令回复通过套接字返回给客户端,具体实现为unistd.h/write函数的包装。

当服务器有命令回复需要传送给客户端的时候,服务器会将客户端套接字的AE_WRITABLE事件和命令回复处理器关联起来,当客户端准备好接收服务器传回的命令回复时,就会产生AE_WRITABLE事件,引发命令回复处理器执行,并执行相应的套接字写入操作。

当命令回复发送完毕之后,服务器就会解除命令回复处理器与客户端套接字的AE_WRITABLE事件之间的关联。

1.4.2 select、poll、epoll支持

Redis6系列13-Redis为什么这么快?

1.5 虚拟内存机制

Redis直接自己构建了VM机制 ,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求。

Redis的虚拟内存机制是啥呢?

虚拟内存机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过VM功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。

2. 冷知识:redis到底有多快?

Redis6系列13-Redis为什么这么快?

在成功安装了Redis之后,Redis自带一个可以用来进行性能测试的命令 redis-benchmark,通过运行这个命令,我们可以模拟N个客户端同时发送请求的场景,并监测Redis处理这些请求所需的时间。

根据官方的文档,Redis经过在60000多个连接中进行了基准测试,并且仍然能够在这些条件下维持50000 q/s的效率,同样的请求量如果打到MySQL上,那肯定扛不住,直接就崩掉了。也是因为这个原因,Redis经常作为缓存存在,能够起到对数据库的保护作用。10W qps

Redis6系列13-Redis为什么这么快?

参考文章: Redis为什么这么快? 大厂经典面试题:Redis为什么这么快?

转载自:https://juejin.cn/post/7058557791081857031
评论
请登录