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)
  • 支持动态扩容
  • 减少内存分配次数
  • 二进制安全
相关推荐
SPC的存折3 分钟前
1、MySQL故障排查与运维案例
linux·运维·服务器·数据库·mysql
小臭希5 分钟前
Redis(NoSQL数据库,Linux-Ubuntu环境下)
数据库·redis·缓存
cdcdhj7 分钟前
在window下将Mongodb单机改为副本集,只用于测试环境,实际上并没有增加真的副本集
数据库·mongodb
xcjbqd011 分钟前
如何修改Oracle服务器默认的日期格式_NLS_DATE_FORMAT全局配置
jvm·数据库·python
HealthScience12 分钟前
SpliceVarDB数据集说明
数据库·oracle
倔强的石头_17 分钟前
表空间自动目录创建与存储管理实践:参数化配置与性能优化
数据库
white-persist21 分钟前
【vulhub spring CVE-2018-1270】CVE-2018-1270 Spring Messaging 远程命令执行漏洞 完整复现详细分析解释
java·服务器·网络·数据库·后端·python·spring
鬼先生_sir29 分钟前
MySQL进阶-事务与锁机制
数据库·mysql·mvcc
treacle田1 小时前
达梦数据库-达梦数据库中link链接访问远程Sql Sever-记录总结
数据库·达梦-sqlserver
ClouGence1 小时前
不用搭复杂系统,也能做跨地域数据迁移?
大数据·数据库·saas