redis-原理篇-SDS

引子

redis是由c语言实现的,但是redis中的字符串并没有直接使用c语言中的字符串,因为c语言字符串存在以下问题:

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

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

结构

SDS为结构体,其中有4个参数:

  • len:buf已保存的字符串字节数,不包含结束标示
  • alloc:buf申请的总的字节数,不包含结束标示
  • flags:不同SDS的头类型,用来控制SDS的头大小
  • buf[]:实际存放数据的数组

动态扩容

SDS之所以叫做动态字符串,是因为它具备动态扩容的能力(在存放了某个字符串后,可以在后面追加字符串)

  • 如果新字符串(原字符串+追加的字符串)小于1M,则新空间为扩展后字符串长度的两倍+1;
  • 如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1。

称为内存预分配

优点

  • 获取字符串长度的时间复杂度为O(1)
  • 支持动态扩容
  • 减少内存分配次数
  • 二进制安全
相关推荐
咩咩不吃草4 分钟前
Linux环境下MySQL的安装与使用与Navicat
linux·运维·数据库·mysql·navicat
Aloudata5 分钟前
NoETL 指标平台如何保障亿级明细查询的秒级响应?——Aloudata CAN 性能压测深度解析
数据库·数据分析·自动化·指标平台
maoku666 分钟前
从关键词到语义:向量数据库如何让AI真正理解你的需求
数据库·人工智能
寻道码路6 分钟前
【MCP探索实践】Google GenAI Toolbox:Google开源的企业级AI数据库中间件、5分钟搞定LLM-SQL安全互联
数据库·人工智能·sql·开源·aigc
数据知道7 分钟前
PostgreSQL 核心原理:一文掌握 WAL 缓冲区与刷盘策略(性能与数据安全的权衡)
数据库·postgresql
三个人工作室10 分钟前
mysql允许所有ip地址访问,mysql允许该用户访问自己的数据库【伸手党福利】
数据库·tcp/ip·mysql
小小逐月者10 分钟前
SQLModel 开发笔记:Python SQL 数据库操作的「简化神器」
数据库·笔记·python
QQ828929QQ11 分钟前
MySQL Explain 分析 SQL 执行计划
数据库·sql·mysql
曲幽11 分钟前
FastAPI生命周期管理实战:从启动到关闭,如何优雅地管好你的“资源家当”
redis·python·fastapi·web·shutdown·startup·lifespan
我是小超人-雨石花11 分钟前
postgresql + postgis安装
数据库·postgresql·postgis·空间数据库