Redis动态字符串SDS的实现

 更新时间:2023年11月20日 08:45:33   作者:中二Espresso  
SDS在Redis中是实现字符串对象的工具,本文主要介绍了Redis动态字符串SDS的实现,具有一定的参考价值,感兴趣的可以了解一下

动态字符串SDS

Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。

不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:

  • 获取字符串长度的需要通过运算
  • 非二进制安全
  • 非二进制安全

Redis构建了一种新的字符串结构,称为简单动态字符串Simple Dynamic String),简称SDS

例如,我们执行命令:

set name dcy

那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含“dcy”的SDS

Redis是C语言实现的,其中SDS是一个结构体(类似Java的类),源码如下:

struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len; /* buf已保存的字符串字节数,不包含结束标示*/
    uint8_t alloc; /* buf申请的总的字节数,不包含结束标示*/
    unsigned char flags; /* 不同SDS的头类型,用来控制SDS的头大小
    char buf[];
};

不同SDS的头类型

#define SDS_TYPE_5  0
#define SDS_TYPE_8  1
#define SDS_TYPE_16 2
#define SDS_TYPE_32 3
#define SDS_TYPE_64 4

例如,一个包含字符串“name”的sds结构如下:

SDS之所以叫做动态字符串,是因为它具备动态扩容的能力,例如一个内容为“hi”的SDS:

假如我们要给SDS追加一段字符串 “,Amy” ,这里首先会申请新内存空间:

  • 如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1
  • 如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1。称为内存预分配

优点:

  • 获取字符串长度的时间复杂度为O(1)
  • 支持动态扩容
  • 减少内存分配次数
  • 二进制安全

到此这篇关于Redis动态字符串SDS的实现的文章就介绍到这了,更多相关Redis动态字符串SDS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis未授权访问配合SSH key文件利用详解

    Redis未授权访问配合SSH key文件利用详解

    这篇文章主要给大家介绍了关于Redis未授权访问配合SSH key文件利用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Redis 哨兵集群的实现

    Redis 哨兵集群的实现

    Sentinel是Redis 的高可用性解决方案,本文详细的介绍了redis哨兵集群的实现,非常具有实用价值,需要的朋友可以参考下
    2021-06-06
  • Redis+Hbase+RocketMQ 实际使用问题案例讲解

    Redis+Hbase+RocketMQ 实际使用问题案例讲解

    这篇文章主要介绍了Redis+Hbase+RocketMQ 实际使用问题案例分享,本文结合示例代码给大家讲解的非常详细,需要的朋友可以参考下
    2023-01-01
  • Redis与数据库数据一致性的原因及解决方案

    Redis与数据库数据一致性的原因及解决方案

    Redis作为一种高效的键值对存储系统,常用于缓存数据库减少IO操作,下面这篇文章主要介绍了Redis与数据库数据一致性的原因及解决方案,文中介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • 使用redis实现延迟通知功能(Redis过期键通知)

    使用redis实现延迟通知功能(Redis过期键通知)

    这篇文章主要介绍了使用redis实现延迟通知功能(Redis过期键通知)的相关知识,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-09-09
  • 几分钟教你掌握Redis简单动态字符串SDS

    几分钟教你掌握Redis简单动态字符串SDS

    这篇文章主要为大家介绍了几分钟教你掌握Redis简单动态字符串SDS方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 本地访问不到公网redis的解决方案

    本地访问不到公网redis的解决方案

    本文详述了本地访问不到公网redis的解决方案,包括分析报错原因、Redis配置文件的区别、bind和protected-mode配置的解析,最终通过修改Redis配置文件及创建启动脚本解决了访问不到公网redis得问题,需要的朋友可以参考下
    2024-08-08
  • Redis内存碎片率调优处理方式

    Redis内存碎片率调优处理方式

    Redis集群因内存碎片率超过1.5触发告警,分析发现内因与外因导致内存碎片,内因为操作系统内存分配机制,外因为Redis操作特性,使用Redis内置内存碎片清理机制可有效降低碎片率,但需注意可能影响性能,建议使用MEMORY命令诊断内存使用情况,合理配置参数以优化性能
    2024-09-09
  • Redis模拟延时队列实现日程提醒的方法

    Redis模拟延时队列实现日程提醒的方法

    文章介绍了如何使用Redis实现一个简单的延时任务队列,通过Redis的有序集合特性来存储和管理延时任务,通过定期检查集合中小于等于当前时间的任务并执行,可以实现延时任务的管理,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • redis防止短信恶意调用的实现

    redis防止短信恶意调用的实现

    本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02

最新评论