当前位置: 首页 > news >正文

原理Redis-动态字符串SDS

动态字符串SDS


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

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

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

在这里插入图片描述

Redis构建了一种新的字符串结构,称为简单动态字符串Simple Dynamic String),简称SDS

例如,我们执行命令:

set name dcy

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

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

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

不同SDS的头类型

#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)
  • 支持动态扩容
  • 减少内存分配次数
  • 二进制安全
http://www.lryc.cn/news/236205.html

相关文章:

  • axios的封装之axios是基于什么封装的?
  • 应用软件安全编程-20生成强随机数
  • 【C语言.oj刷题】有序#整型矩阵元素查找##{思路+C源码}
  • rabbitmq默认交换机锁绑定的routingkey-待研究
  • 【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 4
  • 基于STM32CubeMX和keil采用RTC时钟周期唤醒和闹钟实现LED与BEEP周期开关
  • Virtual安装centos后,xshell连接centos
  • Taro.navigateTo 使用URL传参数和目标页面参数获取
  • Unity Meta Quest 一体机开发(七):配置玩家 Hand Grab 功能
  • 我又开始贩卖焦虑了,机器视觉兄弟们,打工这生意盘不活了?让人逃离北上广深,是毒鸡汤吗?
  • hyperledger fabric2.4测试网络添加组织数量
  • 分库分表
  • uniapp自定义组件
  • linux gdb调试
  • java17 linux 环境配置
  • Flutter最新稳定版3.16 新特性介绍
  • nodejs+vue慢性胃炎健康管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
  • 【C++】传递‘类非静态成员函数’用作回调函数
  • vscode 创建 运行c++ 项目
  • Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】
  • 大数据HCIE成神之路之数学(3)——概率论
  • 【论文解读】FFHQ-UV:用于3D面部重建的归一化面部UV纹理数据集
  • simple foc 移植odriver foc的 anti-cogging(抗齿槽算法)
  • 基于深度学习的恶意软件检测
  • 环境配置|GitHub——解决Github无法显示图片以及README无法显示图片
  • AIGC(生成式AI)试用 12 -- 年终再总结
  • Linux下 tar 命令详解
  • SQL单表复杂查询where、group by、order by、limit
  • 安卓中轻量级数据存储方案分析探讨
  • 数据结构【DS】栈的应用