Redis底层数据库之SDS


  1. 高速的存储介质:内存
  2. 优秀的底层数据结构
  3. 高效的IO模型
  4. 高效的线程模型

1. 动态字符串SDS


Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是redis中最常用的一种数据结构。

C语言种字符串存在的一些问题:

  1. 获取字符串长度需要遍历运算
  2. 非二进制安全:假设之间有个结束字符(但未结束),就会提前被终止
  3. 不可修改:字符串被创建之后,被放在内存常量池中,不能修改某个字符,也不能拼接

所以Redis构建了一种新的字符串结构,成为简单动态字符串,简称SDS

Redis是C语言实现的,其中SDS是一个结构体,源码如下:

uint8_t:表示无符号整型

由于len是uint8_t类型,最大值为254,所以字符串最大长度为254(因为char buf[]仍然是C语言的字符串,会有一个结束符)

flags:表示不同的结构体类型

其中一个实例如下图所示:

SDS叫做动态字符串的原因在于其具有动态扩容的能力,分配策略如下:

  • 如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1(1表示结束字符);
  • 如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1,称为预分配,为了减少频繁去申请内存(消费Cpu性能和时间)

假如在该字符串追加一段",AMY",那么会去申请新空间(alloc为申请的存放字符的空间,不包含结束字符)

SDS的优点在于:

  1. 获取字符串长度的时间复杂度为O(1)
  2. 支持动态扩容
  3. 减少内存分配次数
  4. 二进制安全
相关推荐
dingchengyu1 分钟前
Oracle 数据库中递归查询
数据库·oracle
在风中的意志2 分钟前
[数据库SQL] [leetcode-183] 183. 从不订购的客户
数据库·sql
档案宝档案管理5 分钟前
一键对接OA/ERP/企业微信|档案宝实现业务与档案一体化管理
大数据·数据库·人工智能·档案·档案管理
毕设十刻12 分钟前
基于Vue的养老服务平台85123(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
liulanba13 分钟前
AI Agent技术完整指南 第二部分:开发框架
网络·数据库·oracle
蜀中孤鹰15 分钟前
从秒级到毫秒级:一次Redis限流脚本的深度优化实战
redis·spring cloud·lua
风筝在晴天搁浅19 分钟前
hot100 146.LRU缓存
java·缓存
X.Ming 同学21 分钟前
深度解析 Qt 自定义图表视图:频谱图 的设计与高级功能拓展
服务器·网络·数据库
程序猿_极客22 分钟前
【node期末作业开发】Node.js+MySQL 实现销售信息管理系统的增删改查(附源码)
数据库·mysql·node.js
liliangcsdn24 分钟前
MySQL存储字节类数据的方案示例
java·前端·数据库