Redis 高级特性(4)— 单线程架构

Redis 使用了单线程架构和 I/O 多路复用模型来实现高性能的内存数据库服务。

1. 单线程模型

开启三个 redis-cli 客户端同时执行命令。客户端 1 设置一个字符串键值对:

127.0.0.1:6379> set hello world

客户端 2 对 counter 做自增操作:

127.0.0.1:6379> incr counter

客户端 3 对 counter 做自增操作:

127.0.0.1:6379> incr counter

Redis 客户端与服务端的模型可以简化成下图,每次客户端调用都经历了发送命令、执行命令、返回结果三个过程。
在这里插入图片描述

其中第 2 步是重点要讨论的,因为 Redis 是单线程来处理命令的,所以一条命令从客户端达到服务端不会立刻被执行,所有命令都会进入一个队列中,然后逐个被执行。
在这里插入图片描述
所以上面 3 个客户端命令的执行顺序是不确定的,如下图所示。但是可以确定不会有两条命令被同时执行
在这里插入图片描述

所以两条 incr 命令无论怎么执行最终结果都是 2,不会产生并发问题,这就是 Redis 单线程的基本模型。

Redis 是单线程的。那么为什么说是单线程呢?Redis 在 Reactor 模型内开发了事件处理器,这个事件处理器分为多个 Socket(套接字)、IO 多路复用程序、事件分派器、事件处理器(连接应答处理器、命令请求处理器、命令回复处理器),其中事件派发器的队列是由单线程的事件处理器消费的,也是因为这个,Redis 才叫单线程模型。

当多个事件并发出现时,I/O 多路复用程序将监听到的所有 Socket,关联不同的事件处理器,这个关联操作以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向事件分派器传送 Socket:当上一个套接字产生的事件被处理完毕之后,I/O 多路复用程序才会继续向事件分派器传送下一个套接字。

2. 为什么单线程还能如此快

为什么 Redis 使用单线程模型会达到每秒万级别的处理能力呢?可以将其归结为三点:

  1. 纯内存访问,Redis 将所有数据放在内存中,内存的响应时长大约为 100 纳秒,这是 Redis 达到每秒万级别访问的重要基础。
  2. 非阻塞 I/O,Redis 使用 epoll 作为 I/O 多路复用技术的实现,再加上 Redis 自身的事件处理模型将 epoll 中的连接、读写、关闭都转换为件,不在网络 I/O 上浪费过多的时间。
  3. 单线程避免了线程切换和竞态产生的消耗。

单线程能带来几个好处:

  1. 单线程可以简化数据结构和算法的实现。如果对高级编程语言熟悉的读者应该了解并发数据结构实现不但困难而且开发测试比较麻烦。
  2. 单线程避免了线程切换和竞态产生的消耗,对于服务端开发来说,锁和线程切换通常是性能杀手。

但是单线程会有一个问题:对于每个命令的执行时间是有要求的。如果某个命令执行过长,会造成其他命令的阻塞,对于 Redis 这种高性能的服务来说是致命的,所以 Redis 是面向快速执行场景的数据库。

本文摘自 《Redis 开发运维》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值