前言
本篇文章主要结合自己的理解重点解答以下几个问题:
- 单线程的 Redis 为什么这么快?
- Pipeline有什么好处,为什么要用pipeline?
这些问题都和redis 内部是如何执行命令有关。
redis 内部命令的执行方式
我们知道redis采用的是单线程和I/O多路复用模型来实现高性能的内存数据库服务的。复制代码
如图,执行每一条命令的时候,都会经过以下几个过程:
- 发送命令
- 执行命令
- 返回结果 如果是同时发送多条命令时,这些命令都会进入一个队列中,然后逐步被执行。
一. 单线程的 Redis 为什么这么快?
> 纯内存访问,redis 的所有数据都放在内存中,在内存中执行相应的指令响应非常快; > 非阻塞I/O,redis采用epoll作为IO 多路复用技术的实现,在加上redis自身的事件模型,减少了网络I/O消耗时间 > 单线程架构:避免线程切换和竞态产生的消耗。 > Redis 内部使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。复制代码
二. Pipeline有什么好处,为什么要用pipeline?
我们知道每发送一条redis命令,都会经过(1)发送命令,(2)命令排队,(3)执行命令和(4)返回结果这几步,如果将这(1)(4)步的消耗时间称为一个RRT(往返时间),采用pipeline 可以极大的减少RRT, 因为采用pipeline 是将多条命令同时发送到服务端,以及多条命令的响应结果同时发送到客户端,这样采用批量的操作方式可以极大的减少这2部分的时间.
比如如果有n条命令,如果一条条发送,那么就需要n次RRT, 如果采用pipiline机制的话就只需要1次RRT
当然redis 提供了部分批量操作命令也能实现相同的效果复制代码
三.小结
本文结合自己的理解简单的解答了一下上面的2个问题,下篇文章主要谈谈redis持久化机制相关的问题。