当前位置:网站首页>【数据库学习】Redis 解析器&&单线程&&模型
【数据库学习】Redis 解析器&&单线程&&模型
2022-07-31 05:09:00 【黎燃(主号)】
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个数量级。因此,在串行模式下,单个连接在网络上等待的时间最多,服务器的处理能力没有得到充分利用。
边栏推荐
- 太厉害了,终于有人能把文件上传漏洞讲的明明白白了
- MySQL8--Windows下使用压缩包安装的方法
- Redis Advanced - Cache Issues: Consistency, Penetration, Penetration, Avalanche, Pollution, etc.
- <urlopen error [Errno 11001] getaddrinfo failed>的解决、isinstance()函数初略介绍
- torch.normal函数用法
- The monitoring of Doris study notes
- 工作流编排引擎-Temporal
- 剑指offer基础版 --- 第24天
- Refinement of the four major collection frameworks: Summary of List core knowledge
- 目标检测学习笔记
猜你喜欢
MySQL (updating)
Unity mobile game performance optimization series: performance tuning for the CPU side
mysql5.7.35安装配置教程【超级详细安装教程】
【一起学Rust】Rust学习前准备——注释和格式化输出
docker安装postgresSQL和设置自定义数据目录
[mysql improves query efficiency] Mysql database query is slow to solve the problem
工作流编排引擎-Temporal
ES source code API call link source code analysis
限流的原理
详解扫雷游戏(C语言)
随机推荐
可以“繁殖”的程序
ES source code API call link source code analysis
面试官:生成订单30分钟未支付,则自动取消,该怎么实现?
Reference code series_1. Hello World in various languages
MySQL8.0安装教程,在Linux环境安装MySQL8.0教程,最新教程 超详细
Tapdata 与 Apache Doris 完成兼容性互认证,共建新一代数据架构
面试官问我TCP三次握手和四次挥手,我真的是
Lock wait timeout exceeded解决方案
第7章 网络层第3次练习题答案(第三版)
数据库上机实验4 数据更新和视图
Flink sink redis 写入Redis
tf.keras.utils.get_file()
Anaconda configure environment directives
数据库学习笔记
The interviewer asked me TCP three handshake and four wave, I really
剑指offer基础版 --- 第21天
Proteus 8 Professional安装教程
剑指offer基础版 ----- 第25天
账号或密码多次输入错误,进行账号封禁
Quickly master concurrent programming --- the basics