原理Redis-动态字符串SDS

动态字符串SDS

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

不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:

  • 获取字符串长度的需要通过运算
  • 非二进制安全
  • 非二进制安全

Redis构建了一种新的字符串结构,称为简单动态字符串S imple D ynamic S tring),简称SDS

例如,我们执行命令:

复制代码
set name dcy

那么Redis将在底层创建两个SDS,其中一个是包含"name"的SDS,另一个是包含"dcy"的SDS

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

c 复制代码
struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len; /* buf已保存的字符串字节数,不包含结束标示*/
    uint8_t alloc; /* buf申请的总的字节数,不包含结束标示*/
    unsigned char flags; /* 不同SDS的头类型,用来控制SDS的头大小
    char buf[];
};

不同SDS的头类型

c 复制代码
#define SDS_TYPE_5  0
#define SDS_TYPE_8  1
#define SDS_TYPE_16 2
#define SDS_TYPE_32 3
#define SDS_TYPE_64 4

例如,一个包含字符串"name"的sds结构如下:

SDS之所以叫做动态字符串,是因为它具备动态扩容的能力,例如一个内容为"hi"的SDS:

假如我们要给SDS追加一段字符串 ",Amy" ,这里首先会申请新内存空间:

  • 如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1
  • 如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1。称为内存预分配


优点:

  • 获取字符串长度的时间复杂度为O(1)
  • 支持动态扩容
  • 减少内存分配次数
  • 二进制安全
相关推荐
睡不醒男孩03082317 小时前
第二篇:深入探索开源数据库高可用:构建基于CLup的PostgreSQL生产级高可用与读写分离架构
数据库·postgresql·开源·clup
Micro麦可乐19 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
码农阿豪19 小时前
从零到一:Spring Boot快速接入金仓数据库实战
数据库·spring boot·后端
鼎讯信通20 小时前
风电光缆运维提质增效:G-4000A 光缆故障追踪仪破解风场巡检难题
运维·网络·数据库
三十..20 小时前
MySQL 从入门到高可用架构实战精要
运维·数据库·mysql
cfm_291421 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
真实的菜21 小时前
Redis 从入门到精通(十二):典型业务场景实战 —— 排行榜、限流器、秒杀系统、Session 共享
数据库·redis·python
你想考研啊21 小时前
mysql数据库导出导入
数据库·mysql·oracle
十年编程老舅1 天前
Linux DRM:底层逻辑与实践架构
数据库·mysql
The Sheep 20231 天前
Vue复习
linux·服务器·数据库