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)
  • 支持动态扩容
  • 减少内存分配次数
  • 二进制安全
相关推荐
adinnet202627 分钟前
客服与工单:响应时长与满意度问数
数据库·人工智能
文人sec1 小时前
MYSQL:insert...select:为什么锁源表的所有行和间隙?怎么最快地复制一张表?
数据库·python·mysql
oradh2 小时前
Oracle联机日志文件损坏故障总结
数据库·oracle·oracle联机日志文件损坏
IvorySQL2 小时前
PostgreSQL 日报|8 字节 TOAST 值支持(9 月 16 日)
数据库·人工智能·postgresql
实验室管理云平台2 小时前
北京盛元广通推疾控中心实验室管理系统,提升检测效率
数据库·python
晴空蓝天2 小时前
Spring Boot 3.5 脚手架里的 JWT + Redis 双轨会话,双端 token 隔离我是这么设计的
java·spring boot·redis
极限实验室3 小时前
INFINI Easysearch 向量搜索实战(一)
数据库·搜索引擎
枫叶丹43 小时前
数据库上 Kubernetes 后,KES-Operator 如何简化集群运维
数据库
蓝速科技3 小时前
数字人一体机芯片选型:RK3576 与 X86 场景化对比指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
IvorySQL3 小时前
AI 时代,PostgreSQL 正在发生什么变化?
数据库·人工智能·postgresql