开发者社区> 黎燃> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【数据库学习】Redis 解析器&&单线程&&模型

简介: 【数据库学习】Redis 解析器&&单线程&&模型
+关注继续查看

@[toc]

Redis 协议的高性能解析器

在这里插入图片描述

虽然redis协议很容易阅读和实现,但它可以以类似于二进制协议的性能实现。
Resp使用前缀长度传输大容量数据,因此它不需要扫描负载以查找JSON之类的特殊字符,也不需要引用需要发送到服务器的负载。
批次和多批次长度可以使用代码进行处理,这些代码对每个字符执行单个操作,并同时扫描CR字符,例如以下C代码:
Resp使用前缀长度传输多行数据,因此它不需要扫描负载以查找JSON之类的特殊字符,也不需要引用需要发送到服务器的负载。
可以用代码处理多行和多行长度。该代码对每个字符执行单个操作,并同时扫描CR字符。

#include <stdio.h>

int main(void) {
    unsigned char *p = "$123\r\n";
    int len = 0;

    p++;
    while(*p != '\r') {
        len = (len*10)+(*p - '0');
        p++;
    }

    /* Now p points at '\r', and the len is in bulk_len. */
    printf("%d\n", len);
    return 0;
}

识别第一个CR后,您可以跳过它和下面的LF,而无需任何处理。然后,可以使用不以任何方式检查有效负载的单个读取操作来读取大容量数据。最后,剩余的Cr和LF字符将在不进行任何处理的情况下丢弃。
Redis协议的性能与二进制协议相当。更重要的是,它很容易在大多数高级语言中实现,从而减少了客户端软件中的错误数量。

C语言实现,虽然C有助于redis的性能,但语言不是核心因素。
纯内存输入/输出。与其他基于磁盘的数据库相比,redis的纯内存操作具有天然的性能优势。
输入/输出多路复用,基于epoll/select/kqueue等输入/输出多路复用技术,实现高吞吐量的网络输入/输出。
在单线程模型中,一个线程不能使用多个内核,但另一方面,它避免了多线程频繁切换上下文和锁等同步机制的开销。
在这里插入图片描述

单线程

对于DB,CPU通常不是瓶颈,因为大多数请求不是CPU密集型的,而是i/o密集型的。对于redis,如果不考虑rdb/aof等持久化方案,redis是一个完整的纯内存操作,执行速度非常快。因此,这部分操作通常不是性能瓶颈。redis真正的性能瓶颈在于网络i/o,即客户端和服务端之间的网络传输延迟。因此,redis选择单线程i/o多路复用来实现其核心网络模型。

避免过多的上下文切换开销

在多线程调度过程中,需要在CPU之间切换线程上下文,上下文切换涉及一系列寄存器替换,如程序计数器、堆栈指针和程序状态字、程序堆栈重置,甚至CPU缓存和TLB快速表的替换。如果在进程内进行多线程切换,则效果更好,因为单个进程内的多线程共享进程地址空间,因此,线程上下文比进程上下文小得多。如果是跨进程调度,则需要切换整个进程地址空间。
如果是单线程,则可以避免进程中频繁切换线程的开销,因为程序始终在进程中的单线程中运行,并且不存在多线程切换的场景。

期望的多线程编程与实际的多线程编程相比:
在这里插入图片描述

网络模型

Redis协议通过TCP,客户端和Redis实例保持双工连接,如下图所示:
在这里插入图片描述

序列化实现

序列化的实现相对简单。在执行前一个命令后,同一个连接发送第二个请求。如下图所示:
在这里插入图片描述

单连接吞吐量 = 1 / (2*网络延迟 + 服务器处理时间 + 客户端处理时间)

redis对单个请求的处理时间(10微秒)通常比LAN的延迟小1个数量级。因此,在串行模式下,单个连接在网络上等待的时间最多,服务器的处理能力没有得到充分利用。
在这里插入图片描述

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数据火器库 - 八卦系列之借老枪谈可靠性
上次聊了瑞士军刀SQLite, 从年纪上SQLite出生于大数据和手机时代之前,对比后来的大数据引擎和云原生数据库,SQLite可谓个头不大,辈分不小了。不过数据库的爷爷辈应该算是79年的Oracle和83年的Db2/z(z又叫mainframe,国内称主机)。今天用这把老枪讲讲可靠性。
20 0
海量数据场景下机器学习模型训练方案
实际处理和解决机器学习工程化问题过程中,我们很难通过单点完成机器学习模型的训练。这些场景包括在线推荐,CTR预估,Lookalike营销等,当有上亿条数据,上千上万维特征,这些应用涉及到的数据量在10G以上甚至TB级别,那么该如何基于海量数据来训练模型呢?
1490 0
Redis的数据类型之String
Redis主要支持的数据类型有5种:String ,Hash ,List ,Set ,和 Sorted Set。 Redis数据类型String string类型在redis中是最常见的类型,value存储最大数据量为512M,可以存放json数据,图像数据等等。
1108 0
PowerDesigner教程系列(二)概念数据模型
原文 http://www.cnblogs.com/yxonline/archive/2007/04/09/705631.html    目标:本文主要介绍PowerDesigner概念数据模型以及实体、属性创建。
816 0
PowerDesigner教程系列(一)概念数据模型
原文http://www.cnblogs.com/yxonline/archive/2007/04/09/705479.html 目标:本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念。
918 0
PowerDesigner教程系列(四)概念数据模型
原文http://www.cnblogs.com/yxonline/archive/2007/04/11/708271.html   目标:本文主要介绍如何定义实体的主、次标识符。一、标识符标识符是实体中一个或多个属性的集合,可用来唯一标识实体中的一个实例。
695 0
PowerDesigner逆向工程生成PDM模型及数据库
原文 http://www.cnblogs.com/springside4/archive/2012/04/16/2481149.html 在数据建模过程中,我们建立概念数据模型,通过正向工程生成物理数据模型,生成数据库建 库脚本,最后将物理数据模型生成关系数据库。
1458 0
+关注
112
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载