API的理解和使用——单线程架构

核心知识点:

1.单线程机制:所有命令放在一个队列中

2.为什么Redis单线程这么快?内存中执行、非IO阻塞、避免线程切换和竞态产生的消耗。

3.单线程的问题?一个命令不能执行太长时间,不然会阻塞其他命令的执行。

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

下面尝试说明Redis单线程命令处理机制,接着分析Redis单线程模型为什么性能如此之高。

1.单线程命令的处理机制

Redis客户端与服务端的模型可以简化成下图:

每次客户端调用都经历了发送命令、执行命令、返回结果三个过程。

因为Redis是单线程来处理命令,所以一条命令从客户端到达服务端不会立即被执行,所有的命令都会进入一个队列,然后逐个被执行。

所有即使是有先后顺序的几个命令到达服务端的执行顺序也是不确定的,因为中间有网络传输。

但是可以肯定的是,不会有两条命令被同时执行。

这样就不会产生并发问题,这就是Redis单线程的基本模型。

2.为什么单线程还能这么快?

通常来将,单线程的处理能力要比多线程差,因为10个人干活肯定要比1个人干活快。

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

第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。

第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,

  再加上Redis自身的事件处理模型将epoll中连接、读写、关闭都转换为事件,不在网络I/O上浪费过多时间。

第三,单线程避免了线程切换和竞态产生的消耗

既然单线程就能达到如此高的性能,那么也不失为一种不错的选择,因为单线程能带来几个好处:

首先,单线程可以简化数据结果和算法的实现。在高级语言中,并发数据结构不但实现很难而且开发测试比较麻烦。

其次,单线程避免了线程切换和竞态产生的消耗,对于服务端开发来所,锁和线程切换通常是性能杀手。

但是,单线程会有一个问题:对于每个命令的执行事件是有要求的。如果某个命令执行过长,会造成其他命令的阻塞,

对于Redis这种高性能的服务来说是致命的,所以Redis是面向快速执行场景的数据库。

时间: 2024-10-10 12:09:21

API的理解和使用——单线程架构的相关文章

理解本真的REST架构风格

引子 在移动互联网.云计算迅猛发展的今天,作为一名Web开发者,如果您还没听说过“REST”这个buzzword,显然已经落伍了.夸张点说,甚至“出了门都不好意思跟别人打招呼”.尽管如此,对于REST这个泊来品的理解,大多数人(包括一些资深的架构师)仍然停留在“盲人摸象”的阶段.常常听到各种各样关于REST的说法,例如:有人说:“我们这套新的API决定不用Web Service(SOAP+WSDL),而是直接使用HTTP+JSON,也就是用RESTful的方式来开发.” 不用SOAP,甚至也不用

理解本真的REST架构风格(转)

本文是“深入探索REST”专栏系列深度内容中的第二篇,它将带您领略REST架构的起源.与Web的关系.REST架构的本质及特性,以及REST架构与其他架构风格之间的比较. 引子 在移动互联网.云计算迅猛发展的今天,作为一名Web开发者,如果您还没听说过“REST”这个buzzword,显然已经落伍了.夸张点说,甚至“出了门都不好意思跟别人打招呼”.尽管如此,对于REST这个泊来品的理解,大多数人(包括一些资深的架构师)仍然停留在“盲人摸象”的阶段.常常听到各种各样关于REST的说法,例如:有人说

深入理解REST与Servlet架构的区别

深入理解REST与Servlet架构的区别 本身这个比较是个伪命题,因为 RESTful Service是一个软件架构"风格", 而servlet是java 服务端的一种技术 之所以把它们拿出来比较,是由于它们代表了两个时代的技术风格与架构.下面就来阐述这两种技术架构的区别. Servelt API是1998年发布的,它的核心API一直变化不大,非常稳定,也是JavaEE众多API中最成功的一个.基于Servlet API产生了众多的框架,比较大家最熟悉的Structs,Spring

[转]理解本真的REST架构风格-By李锟

最近看到一个词语“REST”风格,就百度了一下,度娘很给力,下面就是我认为写的最好的一篇介绍. 原文地址:http://www.infoq.com/cn/articles/understanding-restful-style 本文是“深入探索REST”专栏系列深度内容中的第二篇,它将带您领略REST架构的起源.与Web的关系.REST架构的本质及特性,以及REST架构与其他架构风格之间的比较. 引子 在移动互联网.云计算迅猛发展的今天,作为一名Web开发者,如果您还没听说过“REST”这个bu

转:理解本真的 REST 架构风格

引子 在移动互联网.云计算迅猛发展的今天,作为一名 Web 开发者,如果您还没听说过"REST"这个 buzzword,显然已经落伍了.夸张点说,甚至"出了门都不好意思跟别人打招呼".尽管如此,对于 REST 这个泊来品的理解,大多数人(包括一些资深的架构师)仍然停留在"盲人摸象"的阶段.常常听到各种各样关于 REST 的说法,例如:有人说:"我们这套新的 API 决定不用 Web Service(SOAP+WSDL),而是直接使用 H

理解 Javascript 的单线程,着实不易

理解 Javascript 的单线程,着实不易. 比如,对于 C 系编程来说,写个 while(true) 不是什么令人紧张的事情.在 nodejs 中似乎也不会出什么意外,因为还有消息机制可以操控--这只是你对 nodejs 的幻觉,或者说,这只是我对 nodejs 的幻觉.若子进程写成这样的话: process.on('message', function() { while(true); }); process.on('SIGINT', function() { console.log('

qnx:从API开始理解QNX -- 消息传递

从API开始理解QNX -- 消息传递    http://www.openqnx.com/chinese/viewtopic.php?f=5&t=2161 1. 频道与连接    Channel, Connect        server:        ChannelId = ChannelCreate(Flags);    client:        ConnectionId = ConnectAttach(Node, Pid, Chid, Index, Flag);        N

API的理解和使用——字符串的命令

字符串的命令复习表 命令 作用 set   setex   setnx   get   mset   mget   incr   decs   incrby   decrby   incrbyfloat   append   strlen   getset   setrange   getrange   字符串类型是Redis最基础的数据结构.首先键都是字符串类型. 而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础. 字符串类型的值可以是字符串(

第二章 API的理解和使用

2.1.1全局命令 Key * 查看所有键,(慎用,会把所有键都遍历一次并列出) Dbsize 查看键总数,不会遍历所有键,只是从内置函数中读取一个数 Exists [key] 检查键是否存在 Del [key] 删除键 Expire [key] [seconds] 设置键过期时间 Type [key] 键的数据结构类型 2.1.2数据结构和内部编码 Type命令实际返回的就是当前键的数据结构类型:string字符串,hash哈希,list列表,set集合,zset有序集合,但这些只是redis