惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Blog — PlanetScale
Blog — PlanetScale
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
D
DataBreaches.Net
L
LangChain Blog
F
Fortinet All Blogs
C
Check Point Blog
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Help Net Security
J
Java Code Geeks
月光博客
月光博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
宝玉的分享
宝玉的分享
Jina AI
Jina AI

Jiajun的技术笔记

你好,2026! TiDB 源码阅读(六):TiDB Coprocessor 源码解析 性能优化的核心思想 TiDB 源码阅读(五):索引 TiDB 源码阅读(四):AST、逻辑计划、物理计划 CockroachDB Serverless Architecture podman 无故退出 Cursor Control-L (CTRL-L) Keyboard Shortcuts in Terminal Replace docker with podman Using xmonad with xfce4 A RC script for freebsd frpc 自己动手写一个k8s controller AI 会取代你的(编程)岗位吗? 自建DERP服务器提升Tailscale连接速度(使用Nginx转发) 自动升级Docker容器 再读《程序员修炼之道-从小工到专家》 让浏览器下载文件 再读《软件随想录》/《黑客与画家》/《软技能》 HTTP 压力测试中的 Coordinated Omission 2的补码 编程语言中的 context 是什么? flutter macOS 构建出错 Flatpak 使用小记 Golang CAS 操作是怎么实现的 PostgreSQL 当MQ来使用 Clash 结合 工作VPN 的网络设计 使用 PostgreSQL 搭建 JuiceFS PostgreSQL 配置优化和日志分析 有GitHub Copilot?那就可以搭建你的ChatGPT4服务 窗口函数的使用(以PG为例)
消息分帧(字符串设计或协议设计)的两种形式
Jiajun Huang · 2019-08-05 · via Jiajun的技术笔记

消息分帧(字符串设计或协议设计)的两种形式

如果你读过Redis的源码,那么一定知道Redis的sds的设计。C语言中,字符串以 '\0' 结尾,printf 函数 遇到 '\0' 之后便会停止输出;而sds则是为字符串增加了一个长度,首先我们读取这个字符串长度为多少,然后 打印多少个字符。

这就是消息分帧中常见的两种形式:

  • Length prefixing 预先放置长度,这种形式就是在真正的字符串之前放置一个长度,以表明字符串的长度。例如 10helloworld。 这样做的好处是可以提前知道长度,然后再打印,获取字符串长度的时间复杂度为 O(1)。坏处是字符串长度有最大长度的限制, 而且由于不同的长度时,并不能全部使用到 int 所占用的位,所以可能会造成一定的空间浪费,但是也有解决方案,可以看redis 最新的sds设计。此外,这种形式的设计是二进制安全的。
  • Delimiters 分隔符,这种形式就和C语言中的一致,使用一个特殊的分隔符来代表终结。这种做法的好处在于节省空间,但是坏处也 很明显:非二进制安全;获取字符串长度的时间复杂度为 O(N)

这两种形式各有好坏。

前者在现实世界中的使用案例有Redis中的sds设计,HTTP/2协议,TCP协议,Redis通信协议等等多种协议; 后者在现实世界中的使用案例有UNIX系统中的文件(以EOF结束), C语言中的字符串(以\0结束)等。

实际使用中,我们需要根据实际的场景来决定使用哪一种。



相关文章