当前位置:网站首页>【数据库学习】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个数量级。因此,在串行模式下,单个连接在网络上等待的时间最多,服务器的处理能力没有得到充分利用。
边栏推荐
- 有了MVC,为什么还要DDD?
- 剑指offer专项突击版 ---- 第 6 天
- [Introduction to MySQL 8 to Mastery] Basics - silent installation of MySQL on Linux system, cross-version upgrade
- Temporal对比Cadence
- Unity mobile game performance optimization series: performance tuning for the CPU side
- 2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。
- Kubernetes 证书可用年限修改
- Swordsman Offer Special Assault Edition --- Day 3
- wx.miniProgram.navigateTo在web-view中跳回小程序并传参
- Anaconda配置环境指令
猜你喜欢

Interviewer: If the order is not paid within 30 minutes, it will be automatically canceled. How to do this?

剑指offer基础版 --- 第22天

剑指offer基础版 --- 第24天

Tapdata 与 Apache Doris 完成兼容性互认证,共建新一代数据架构

剑指offer基础版 --- 第21天

“档次法”——用于物品体积分布不均匀的01背包问题的求解方法

面试官,不要再问我三次握手和四次挥手
uni-app进阶之生命周期【day8】
![2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。](/img/7f/130a9b733855a2bab07d26ffda2c49.png)
2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。

Mysql——字符串函数
随机推荐
剑指offer专项突击版 ---- 第2天
剑指offer基础版 ----- 第25天
剑指offer基础版--- 第23天
剑指offer基础版 ----- 第28天
wx.miniProgram.navigateTo在web-view中跳回小程序并传参
docker安装postgresSQL和设置自定义数据目录
【MQ我可以讲一个小时】
C语言文件读、写、定位函数
C语言教程(一)-准备
再见了繁琐的Excel,掌握数据分析处理技术就靠它了
pycharm专业版使用
Interviewer: If the order is not paid within 30 minutes, it will be automatically canceled. How to do this?
Distributed transaction processing solution big PK!
【MySQL8入门到精通】基础篇- Linux系统静默安装MySQL,跨版本升级
【LeetCode-SQL每日一练】——2. 第二高的薪水
.NET-6.WinForm2.NanUI learning and summary
mysql stored procedure
Shell重油常压塔模拟仿真与控制
剑指offer基础版 ---- 第27天
Flask-based three-party login process