Redis的设计与实现 简单动态字符串SDS

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis的设计与实现 简单动态字符串SDS

一 SDS的定义

  • Redis没有使用C语言传统的字符串表示,他自己构建了一个简单动态字符串的抽象类型,他就是SDS,redis里面C字符串只会用来无需对字符串进行修改的地方,比如打印日志
  • 数据结构

    struct sdshdr {

    // 记录buf数组中已使用字节的数量
    // 等于SDS所保存字符串的长度
    int len;
    // 记录buf数组中未使用字节的数量
    int free;
    
    // 字节数组,用于保存字符串
    char buf[]

    }

image.png

sds遵循空字符串结尾,因为这样可以直接重用C字符串里面的一些函数比如打印
printf("%s",s->buf)

二 SDS与C字符串的区别

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

    记录自身的长度信息,所以每次获取长度都要遍历,而SDS通过len可以直接得到长度信息,节省性能

  2. 杜绝缓存区溢出

    C语言的字符串不记录自身的长度信息,所以在执行strcat向一个字符串结尾追加另一个字符串时,如果不先扩容,就会把前面的字符串覆盖掉,造成缓存区溢出

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

    C语言的字符串不记录自身的长度信息,增加字符串就要扩容计算,就要重新分配,而SDS通过空间预分配,和惰性空间释放来减少内存重分配

    • 空间预分配

      如果占用空间小于1M,那么就分配和len同样的长度,也就是free空间

    • 惰性空间释放

      当字符串被删除,free空间并不跟着删除,这样下次增加的时候,就可以直接用free的空间

  4. 二进制安全

    C字符串必须符合某种编码,但是有些编码对字符串的判断不一样,比如 redis look,中间有一个空格,对与某个编码可能就是要换行,导致问题,但是SDS判断字符串结束是通过len属性,所以不会有问题。

相关文章
|
5月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
210 32
|
存储 缓存 NoSQL
redis数据结构-字符串
redis数据结构-字符串
113 1
|
12月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
131 4
|
存储 缓存 NoSQL
3)深度解密 Redis 的字符串
3)深度解密 Redis 的字符串
116 1
|
11月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
431 0
|
5月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
1月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
128 1
Redis专题-实战篇二-商户查询缓存
|
18天前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
|
20天前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。