redis string底层为什么使用sds, sds好处?redis 的动态字符串优点?

  1. redis 的键值对,都是由对象组成的,

其中键总是一个字符串对象(string object)

而键的value则可以是:"字符串对象", "列表对象 (list object)","哈希对象 (hash object)", "集合对象(set object)", "有序集合对象(sorted set object)" 这五种对象集合中的一种!

  1. 字符串的键值对,底层都是由两个sds对象组成的。

  2. 简单动态字符串(simple dynamic string, SDS) 结构体:

  1. sds 优点(较c 字符串优缺点):

a. 常数复杂度 获取字符串长度

redis底层为c语言, 而c 语言中字符串,并没有对获取长度参数 进行方法封装,即获取长度,只能进行遍历,直至最后一位获取为空字符,这样时间复杂度比较高o(n) , sds 则是根据len 长度 来记录sds 本身的长度,获取时间复杂度为o (1)

b. 杜绝缓冲区溢出 (我认为叫自动扩容)

c 字符串不记录长度值,在进行字符串的拼接操作时,容易出现溢出。即两个字符串拼接时, 第二个字符串的字符会出现没有全部写入

sds api 则是对于长度校验,如果两个即将拼接的长度超出,则进行扩容,扩展到所需要的大小

c. 减少修改字符串时带来的内存重分配次数

还是由于c 字符串没有 对于长度值得问题,如果这个字符串进行了增加或者删除操作,就会调用新得内存空间,这个调用比较耗时,比较重

sds 则是实现了空间预分配和惰性空间释放策略

空间预分配:简单来说我认为和hashmap 的扩容有点像,新增了一部分空间,留着以后用

惰性空间释放: 用于优化sds的字符串缩短操作,就是如果空间多了,先不会释放,使用free属性,来进行记录,留着将来使用。避免缩短字符串带来的内存重分配操作,sds也有相应api ,如果有需要,可以释放sds 未使用的空间

d. 二进制安全(sds 底层数组为二进制数据,可存储任意格式数据)

c语言 字符串必须符合某种编码规则(比如 ASCII),2. 中间数据不能包含空字符(约定为字符串为空是结尾, 如果有空则被认为结束!)这样会限制c字符串只能保存文本数据

sds 存放在buf数组里的数据为二进制格式,(buf数组 存得不是字符,存的是二进制数据,sds api 方法内 进行了处理),所以sds 可以保存任意格式二进制数据

思考: sds 算不算是装饰器模式呢?增强了c 语言没有的功能,与方法

相关推荐
这个DBA有点耶5 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G5 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备5 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远5 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
IT大白鼠5 天前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz5 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
2601_962218615 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
全栈弄潮儿²⁰²⁴5 天前
AI Agent 开发实战(30):限流、缓存与成本控制
人工智能·gpt·缓存·agent·限流·agi·成本控制
张洛闻Eren5 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安5 天前
MySQL-触发器
数据库·mysql