首页 > 数据库 >Redis底层数据结构 SDS

Redis底层数据结构 SDS

时间:2024-11-04 23:42:44浏览次数:2  
标签:字符 语言 SDS Redis 数组 字符串 数据结构

SDS

字符串在 Redis 中是很常用的,键值对中的键是字符串类型,值有时也是字符串类型。


Redis 是用 C 语言实现的,但是它没有直接使用 C 语言的 char* 字符数组来实现字符串,而是自己封装了一个名为简单动态字符串(simple dynamic string,SDS) 的数据结构来表示字符串,

也就是 Redis 的 String 数据类型的底层数据结构是 SDS。


既然 Redis 设计了 SDS 结构来表示字符串,肯定是 C 语言的 char* 字符数组存在一些缺陷。


C 语言字符串的缺陷


C 语言的字符串其实就是一个字符数组,即数组中每个元素是字符串中的一个字符。


比如,下图就是字符串“xiaolin”的 char* 字符数组的结构:


在 C 语言里,对字符串操作时,char * 指针只是指向字符数组的起始位置,而字符数组的结尾位置就用“\0”表示,意思是指字符串的结束。


因此,C 语言标准库中的字符串操作函数就通过判断字符是不是 “\0” 来决定要不要停止操作,如果当前字符不是 “\0” ,说明字符串还没结束,可以继续操作,如果当前字符是 “\0” 是则说明字符串结束了,就要停止操作。


举个例子,C 语言获取字符串长度的函数 strlen,就是通过字符数组中的每一个字符,并进行计数,等遇到字符为 “\0” 后,就会停止遍历,然后返回已经统计到的字符个数,即为字符串长度。下图显示了 strlen 函数的执行流程:


很明显,C 语言获取字符串长度的时间复杂度是 O(N)(这是一个可以改进的地方)


C 语言字符串用 “\0” 字符作为结尾标记有个缺陷。假设有个字符串中有个 “\0” 字符,这时在操作这个字符串时就会提早结束,比如 “xiao\0lin” 字符串,计算字符串长度的时候则会是 4,如下图:


因此,除了字符串的末尾之外,字符串里面不能含有 “\0” 字符,否则最先被程序读入的 “\0” 字符将被误认为是字符串结尾,这个限制使得 C 语言的字符串只能保存文本数据,

不能保存像图片、音频、视频文化这样的二进制数据(这也是一个可以改进的地方)

标签:字符,语言,SDS,Redis,数组,字符串,数据结构
From: https://www.cnblogs.com/jock766/p/18526971

相关文章

  • 数据结构初阶排序全解
    目录1>>排序前言2>>插入排序2.1>>直接插入排序2.2>>希尔排序3>>选择排序3.1>>直接选择排序3.2>>堆排序4>>交换排序4.1冒泡排序4.2快速排序5>>归并排序6>>测试test.csort.hsort.c7>>总结1>>排序前言    排序顾名思义,就是将一组乱序的数,按从大到小......
  • 数据结构做题记录(1)
    1:P11071「QMSOIR1」DistortedFate二进制的题,优先想到拆位求贡献。因为是或,对于某一位,找到区间中最左的这一位为\(1\)的位置,然后相应的乘上它到右端点的距离,就可以计算答案了。\(logV\)是\(30\),可以想到对二进制的每一位开一棵线段树,维护区间中这一位相关信息。然后就......
  • C语言版数据结构算法(考研初试版—3)--链表定义、创建
    2、链表1、链表结构体typedefstructLNode{   intdata;   structLNode*next; }LNode,*LinkList; 2、遍历链表voidPrintList(LinkListL){   LinkListp=L->next;//Skiptheheadnodewhichisadummynode   while(p!=......
  • C语言版数据结构算法(考研初试版—4)--链表删除操作
    删除链表中值为m的结点(1)创建一个链表(2)打印删除前的链表(3)查找值为m的前一个结点(4)执行删除操作(5)打印删除后的链表#include<stdio.h>#include<stdlib.h>typedefstructLNode{ intdata; structLNode*next;}LNode,*LinkList;//头插法LinkListCreateList_L(){......
  • 数据结构线性表
    语雀链接:https://www.yuque.com/g/wushi-ls7km/ga9rkw/vrhdf9bfkmshpzus/collaborator/join?token=C3AlDSf6fePw1XfO&source=doc_collaborator#《数据结构线性表》......
  • 数据结构期末复习绪论部分
    语雀链接:https://www.yuque.com/g/wushi-ls7km/ga9rkw/atvszq3vugrzblr0/collaborator/join?token=MY21l2k2LPLrQF8l&source=doc_collaborator#《数据结构期末复习绪论部分》......
  • 在Windows中安装Redis
    1、下载Redis下载地址:https://github.com/microsoftarchive/redis选择Release 3.Windows系统中启动和停止RedisWindows系统中启动Redis,直接双击redis-server.exe即可启动Redis服务,redis服务默认端口号为6379双击redis-cli.exe即可启动Redis客户端,默认连接的是本地的Re......
  • mysql服务器上用mysqldump进行数据结构与数据备份
    以下是一个示例命令,它将进行完整的备份并禁用GTIDs:bash mysqldump-uyourusername-p--all-databases--triggers--routines--events--set-gtid-purged=OFF>/path/to/your/complete_dump.sql请将yourusername替换为您的MySQL用户名,/path/to/your/complete_dump.sql......
  • 数据结构 ——— 链式二叉树的前中后序遍历递归实现
    目录前言链式二叉树示意图​编辑手搓一个链式二叉树链式二叉树的前序遍历链式二叉树的中序遍历链式二叉树的后序遍历 前言在上一章学习了链式二叉树的前中后序遍历的解析数据结构———链式二叉树的前中后序遍历解析-CSDN博客接下来要学习的是代码实现链式二叉树......