Redis(4)—— 单线程架构

Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务, 本节首先通过多个客户端命令调用的例子说明Redis单线程命令处理机制, 接着分析Redis单线程模型为什么性能如此之高, 最终给出为什么理解单线程模型是使用和运维Redis的关键。
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-3, 每次客户端调用都经历了发送命令、 执行命令、 返回结果三个过程。

其中第2步是重点要讨论的, 因为Redis是单线程来处理命令的, 所以一条命令从客户端达到服务端不会立刻被执行, 所有命令都会进入一个队列中, 然后逐个被执行。 所以上面3个客户端命令的执行顺序是不确定的( 如图2-4所示) , 但是可以确定不会有两条命令被同时执行( 如图2-5所示) ,所以两条incr命令无论怎么执行最终结果都是2, 不会产生并发问题, 这就是Redis单线程的基本模型。 但是像发送命令、 返回结果、 命令排队肯定不像描述的这么简单, Redis使用了I/O多路复用技术来解决I/O的问题, 下一节将进行介绍。



                         图2-4 所有命令在一个队列里排队等待被执行

2.为什么单线程还能这么快
通常来讲, 单线程处理能力要比多线程差, 例如有10000斤货物, 每辆车的运载能力是每次200斤, 那么要50次才能完成, 但是如果有50辆车, 只要安排合理, 只需要一次就可以完成任务。 那么为什么Redis使用单线程模型会达到每秒万级别的处理能力呢? 可以将其归结为三点:
第一, 纯内存访问, Redis将所有数据放在内存中, 内存的响应时长大约为100纳秒, 这是Redis达到每秒万级别访问的重要基础。
第二, 非阻塞I/O, Redis使用epoll作为I/O多路复用技术的实现, 再加上Redis自身的事件处理模型将epoll中的连接、 读写、 关闭都转换为事件, 不在网络I/O上浪费过多的时间, 如图2-6所示。

第三, 单线程避免了线程切换和竞态产生的消耗。
既然采用单线程就能达到如此高的性能, 那么也不失为一种不错的选择, 因为单线程能带来几个好处: 第一, 单线程可以简化数据结构和算法的实现。 如果对高级编程语言熟悉的读者应该了解并发数据结构实现不但困难

而且开发测试比较麻烦。 

第二, 单线程避免了线程切换和竞态产生的消耗,对于服务端开发来说, 锁和线程切换通常是性能杀手。但是单线程会有一个问题: 对于每个命令的执行时间是有要求的。 如果某个命令执行过长, 会造成其他命令的阻塞, 对于Redis这种高性能的服务来说是致命的, 所以Redis是面向快速执行场景的数据库。

单线程机制很容易被初学者忽视, 但笔者认为Redis单线程机制是开发和运维人员使用和理解Redis的核心之一, 随着后面的学习, 相信读者会逐步理解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值