Redis为什么要自己定义SDS?

简介: Redis用C语言实现,但未采用C的字符数组,而是自创SDS(简单动态字符串)。因C字符串依赖`\0`结尾,无法存任意数据且操作低效。SDS通过添加`len`和`alloc`字段,实现长度常数级获取、高效追加与内存预分配,提升性能与安全性,满足Redis对字符串高频、高效操作的需求。

Redis 是一种 KV 的存储结构,他的 key 是字符串类型,值也支持字符串,所以字符串是 redis 中最常见的一个类型了。Redis 自己本身是通过 C 语言实现的,但是他并没有直接使用 C 语言中的字符数组的方式来实现字符串,而是自己实现了一个 SDS(Simple Dynamic Strings),即简单动态字符串,这是为什么呢?


首先,因为字符串在 Redis 中使用实在是太广泛了,所以对他的基本要求就有两点,第一就是要支持任意字符的存储,第二就是各种操作需要高效。


接着我们看看 C 语言中字符串的实现方式有什么问题呢?很多人可能都忘了,我帮大家回忆一下,C 语言中,字符串是通过字符数组实现的,底层呢是开辟了一块连续的空间,依次存放字符串中的每一个字符。为了表示字符串的结束,他会在字符数组的最后一个字符处记录\0


也就是说,在 C 语言中,当识别到字符数组中的\0字符的时候,就认为字符串结束了,那么这么做会带来哪些问题呢?


就是这样实现的字符串中就不能保存任意内容了,至少\0就不行,因为遇到他的时候就直接截断了,这肯定是接受不了的。


还有就是因为 C 中的字符串以\0作为识别字符串结束的方式,所以他的字符串长度判断、字符串追加等操作,都需要从头开始遍历,一直遍历到\0的时候再返回长度或者做追加。这就使得字符串相关的操作效率都很低。


那么,想要解决上面的两个问题要怎么办呢?那就是在用字符数组表示字符串的同时,在这个字符串中增加一个表示分配给该字符数组的总长度的 alloc 字段,和一个表示字符串现有长度的 len 字段。这样在获取长度的时候就不依赖 \0 了,直接返回 len 的值就行了。


还有呢,就是在做追加操作的时候,只需要判断新追加的部分的 len 加上已有的 len 是否大于 alloc,如果超过就重新再申请新空间,如果没超过,就直接进行追加就行了。


还有很多其他操作,比如复制、比较等都可以使用类似的思想高效的操作。

目录
相关文章
|
存储 消息中间件 缓存
相比游戏客户端,游戏服务端开发无关紧要吗
感觉游戏服务端,除了更新,保存数据啊、生成随机物品啊、都没什么了,好像游戏开发场景中,服务端已经无关紧要了。看着客户端忙成狗,正在摸鱼的你是否也有过这样的疑问?
1334 0
相比游戏客户端,游戏服务端开发无关紧要吗
|
5月前
|
机器学习/深度学习 人工智能 监控
基于视觉大模型的实时监控系统技术实现解析
该AI视觉系统以视觉大模型为核心,实现货架商品缺货、错位等状态的实时智能监控。无需改造现有摄像头,兼容多种硬件,通过“采集-分析-决策”闭环流程,结合轻量化YOLO模型与动态阈值优化,提升识别精度与响应速度,支持快速部署与多SKU扩展,为零售场景提供低成本、高复用的视觉解决方案。
249 0
|
人工智能 运维 前端开发
从极速复制“死了么”APP,看AI编程时代的技术选型
本文以爆款 App“死了么”为例,讲述在AI时代如何通过 Supabase 等 BaaS 服务实现极简全栈开发。借助AI编程工具与无服务器架构,开发者可快速完成从创意到上线的全流程,降低后端复杂度,聚焦核心业务逻辑,实现低成本、高效率的 MVP 落地。
|
8月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
335 10
|
机器学习/深度学习 JSON JavaScript
在linux系统上看全世界新闻 -- Clinews的使用详解
这篇文章介绍了如何在Linux系统上使用Clinews命令行工具阅读全世界的新闻,包括安装、配置API密钥、使用命令获取新闻源和搜索新闻的步骤。
530 3
在linux系统上看全世界新闻 -- Clinews的使用详解
|
5月前
|
安全 数据安全/隐私保护
2026阿里云账号注册流程(以企业用户为例)注册材料、实名认证、企业上云补贴及问题解答FAQ
企业用户注册阿里云账号仅需手机号,注册后须完成实名认证方可使用。本文详解2026年最新企业账号注册、支付宝扫码快速认证流程及常见问题,助力企业高效上云,享最高百万出海补贴。
523 9
|
11月前
|
设计模式 前端开发 JavaScript
MVVM的理解:
MVVM的理解:
553 0
|
存储 SQL Java
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。
|
网络安全 文件存储 C#
Docker 安装迅雷NAS
【7月更文挑战第3天】在Docker中安装迅雷NAS的步骤包括:确保已安装Docker,使用`docker run`命令拉取镜像(可选阿里云仓库),设置容器参数如命名、主机名、网络模式、挂载目录和重启策略,并开启防火墙端口。访问迅雷NAS网页需内测邀请码,注意安全性和内网使用。操作可能因设备和网络环境差异需调整。
2576 15