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. 二进制安全
相关推荐
huan19911015 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
changhong198616 小时前
mybatisPlus打印sql配置
数据库·sql
l1t16 小时前
用官方安装脚本安装duckdb 1.5并测试加载各种插件
数据库·docker·postgresql·kylin
jinanmichael16 小时前
Mybatis控制台打印SQL执行信息(执行方法、执行SQL、执行时间)
数据库·sql·mybatis
J2虾虾16 小时前
给Redis增加密码
数据库·redis·缓存
Mr数据杨16 小时前
【Dv3Admin】Django通用自定义工作台卡片
数据库·django·sqlite
山峰哥16 小时前
SQL优化全攻略:从索引策略到Explain实战解析
大数据·数据库·sql·oracle·性能优化·编辑器
Fox爱分享16 小时前
阿里二面:如何保证 Redis 和 MySQL 的数据一致性?还在背“延时双删”的Sleep玄学?教你高性能 + 高可靠的方案
redis·后端·面试
卤炖阑尾炎16 小时前
Nginx 核心功能全解析:正向代理、反向代理、缓存与 Rewrite 实战
运维·nginx·缓存
JuneXcy17 小时前
第9章 关系模式的规范化设计理论
数据库·mysql