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)
  • 支持动态扩容
  • 减少内存分配次数
  • 二进制安全
相关推荐
代码改变生活-1202 小时前
idea 清除缓存之后重启项目编译失败
java·缓存·intellij-idea
曲幽2 小时前
FastAPI缓存提速实战:手把手教你用Redis为接口注入“记忆”
redis·python·cache·fastapi·web·asyncio
陈天伟教授2 小时前
关系数据库-04. 关系的完整性-参照完整性
数据库·达梦数据库
lkbhua莱克瓦242 小时前
MySQL事务隔离级别:从并发混乱到数据一致性守护者
java·数据库·mysql·隔离级别
hqwest2 小时前
码上通QT实战30--系统设置05-加载报警信息
数据库·qss·报警处理·报警级别·报警条件
dblens 数据库管理和开发工具2 小时前
QueryNote 云端笔记,正式上线
数据库·笔记·querynote·q笔记
@zulnger2 小时前
Django 框架
数据库·django·sqlite
星火开发设计2 小时前
深入浅出HDFS:分布式文件系统核心原理与实践解析
大数据·数据库·hadoop·学习·hdfs·分布式数据库·知识
Java后端的Ai之路3 小时前
【Python教程02】-列表和元组
服务器·数据库·python·列表·元组