当前位置:网站首页>【数据库学习】Redis 解析器&&单线程&&模型
【数据库学习】Redis 解析器&&单线程&&模型
2022-07-25 22:19:00 【华为云】
@[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个数量级。因此,在串行模式下,单个连接在网络上等待的时间最多,服务器的处理能力没有得到充分利用。
边栏推荐
- The second short contact of gamecloud 1608
- Wet- a good choice for people with English difficulties - console translation
- win10搭建flutter环境踩坑日记
- 开户就可以购买收益在百分之六以上的理财产品了吗
- Redis memory elimination mechanism?
- Virtual memory and disk
- 虚拟内存与磁盘
- 如何实现一个App应用程序,限制用户时间使用?
- Wechat official account application development (I)
- 启牛商学院和微淼商学院哪个靠谱?老师推荐的开户安全吗?
猜你喜欢

2day

Selenium basic use and use selenium to capture the recruitment information of a website (continuously updating)

How to implement an app application to limit users' time use?

SQL中in的用法 DQL 查询

【GO基础02】第一个程序

这次龙蜥展区玩的新花样,看看是谁的 DNA 动了?

在进行自动化测试,遇到验证码的问题,怎么办?

H5幸运刮刮乐抽奖 免公众号+直运营

自动化测试岗花20K招人,到最后居然没一个合适的,招两个应届生都比他们强吧

聚名十年,说出你的故事,百万豪礼等你拿
随机推荐
After 2 years of functional testing, I feel like I can't do anything. Where should I go in 2022?
The automation testing post spent 20K recruiting, but in the end, there was no suitable one. Both fresh students are better than them
kubernetes之VictoriaMetrics单节点
How to resolve a domain name to multiple IP addresses?
3dslicer introduction and installation tutorial
手机端微信发朋友圈功能测试点总结
Jenkins+svn configuration
聚名十年,说出你的故事,百万豪礼等你拿
About vscode usage+ Solutions to the problem of tab failure
[assembly language 01] basic knowledge
6-17 vulnerability exploitation - deserialization remote command execution vulnerability
突破性思维在测试工作中的应用
MySQL - subquery - column subquery (multi row subquery)
On the difference between break and continue statements
Output Yang Hui triangle with two-dimensional array
Using simple scripts to process data in 3dslicer
SQL基本语句 DQL select与提取 DML插入删除
Randomly generate 10 (range 1~100) integers, save them to the array, and print the array in reverse order. And find the average value, the maximum value and the subscript of the maximum value, and fin
xxl-job中 关于所有日志系统的源码的解读(一行一行源码解读)
Xiaobai programmer's first day