Redis单线程架构

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

引出单线程模型

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

127.0.0.1:6379> set hello world
OK

客户端2对counter自增操作

127.0.0.1:6379> incr counter

客户端3对counter做自增操作

127.0.0.1:6379> incr counter

redis客户端与服务端的模型可以简化成图(如下图所示),每次客户端调用都经历了发送命令、执行命令和返回结果三个过程。

其中第2步是重点。因为redis是单线程来处理命令的,所以一条命令从客户端到到服务端不会立刻被执行,所有命令都回进入到一个队列中,然后逐个执行。所以以上三个客户端的命令执行顺序是不确定的。

但是可以确定不会有两条命令被同时执行,如下图所示。

所以两条incr命令是无论怎么执行最终结果都是2,不会产生并发的问题,这就是单线程的基本模型。当然排队机制不想我写的这么简单,redis使用了I/O多路复用技术来解决I/O的问题,感兴趣的可以深入研究下。

为什么单线程还这么快?

现在的CPU都是多线程了,可为什么redis使用了单线程速度还这么快。

一般来说,单线程的处理能力要比多线程差,这是毋庸置疑的。比如有10000斤货物,每辆车运载能力每次200斤,那么就要50次来完成,但是如果有50辆车,只要遵循一定的“队列机制”,就可以一次完成,哪为什么redis使用单线程模型还会达到每秒万级的处理能力,大致分为如下三点:

1.redis是基于内存来存储的,然而内存的读取/响应市场大约为100纳秒,这一点也就是redis能打到每秒万级的重要基础。

2.非阻塞I/O,redis使用epoll作为I/O多路复用技术的实现,再加上redis的自身的时间处理模型将epoll中的连接,读写,关闭都转换为时间,不在网络I/O上浪费时间。如下图所示。

3.单线程避免了线程切换和竟态产生的消耗。

单线程带来的好处

1.单线程可以简化数据结构和算法的实现 2.单线程避免了线程切换和竟态产生的消耗,对于服务端来说,锁和线程切换通常是性能杀手。

单线程的问题

1.对于每个命令的执行时间是有要求的。(如果某个命令执行时间过长,就会造成其他命令的阻塞,对于redis这种高性能服务来说是致命的。所以redis是面向快速执行场景的数据库)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

使用Eclipse插件提高Java编码质量

代码质量概述 ? 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行...

36870
来自专栏Keegan小钢

App架构经验总结(一)

原文链接:http://keeganlee.me/post/architecture/20160303 版权声明:本文刊载在《程序员》杂志2016年3期,版权归...

24440
来自专栏编程

一行 Python 代码实现并行

译者:caspar 译文:https://segmentfault.com/a/1190000000414339 原文:https://medium.com/b...

28990
来自专栏Python爱好者

Java基础笔记01

29860
来自专栏Python中文社区

使用Python分析nginx日志

使用Python分析nginx日志 专栏作者:熊球 ♚土木工程毕业,现从事web后端开发方面的工作,擅长python,flask框架等。 博客:codechat...

319100
来自专栏测试驿栈

Jmeter(九)_获取JDBC响应做接口关联

http://www.cnblogs.com/Zfc-Cjk/p/8295495.html

17040
来自专栏.NET开发者社区

什么是ORM?为什么用ORM?浅析ORM的使用及利弊

什么是ORM ORM(Object-relational mapping),中文翻译为对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术...

217100
来自专栏腾讯移动品质中心TMQ的专栏

基于 hook 和 gmock 开展单元测试

单元测试又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函...

95620
来自专栏华章科技

Java 10新特性解密

请注意,本文中所包含的信息在写本文时是准确的。但是到发布时,JDK 10特性组预计将会增加。

9120
来自专栏nothing

游戏服务端开发的逻辑解耦思路

最开始的代码库中,主循环收到协议后,通过手写的路由关系转交给对应的业务逻辑类实现。

25730

扫码关注云+社区

领取腾讯云代金券