• 2、Redis中简单动态字符串的简介,也就是Redis中的键和值的字符串底层表达


    简介

    首先在Redis中,没有直接使用C语言传统字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型(可以简单的理解为Java中的String 类),并且将SDS用作Redis的默认字符串表示。

    C语言字符串:

    #include 
    
    int  main()
    
    {
    
    
         char c0[] = { 'c', ' ', 'p', 'r', 'o', 'g'}; //普通字符数组
    
        printf("c0 = %s\n", c0); //没有乱码,因为编译的时候,以字符串格式输出的时候,默认在数组尾部追加了'\0' 
        
    
        char c1[] = { 'c', ' ', 'p', 'r', 'o', 'g' ,0}; //普通字符数组
    
        printf("c1 = %s\n", c1); //没有乱码 
    
        //以 0 (‘\0’就是数字0)结尾的字符数组是字符串
    
        char c2[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0' };
    
        printf("c2 = %s\n", c2);
    
        //字符串处理以‘\0’(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出
    
        char c3[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0' };
    
        printf("c3 = %s\n", c3);
    
        return 0;
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    Redis里面,C字符串只会作为字符串字面量(string literal)用在一些无需对字符串值,修改的地方,例如打印日志:

    redisLog(REDIS_WARNING,"Redis is now reday to exit,bye bye . . .")
    
    • 1

    当Redis需要的不仅仅 是一个字符串字面量,而是一个可以被修改的字符串值的时候,就会采用SDS来表示字符串值,比如Redis 的数据库里面,包含字符串值得键值对在底层都是由SDS实现的。

    举个例子:
    如果客户端执行一个命令:

    redis > SET msg "hello world"
    OK
    
    • 1
    • 2

    那么Redis 将在数据库中创建一个新的键值对,其中:
    键值对的键 msg ,底层实现是一个保存着字符串"msg"的SDS
    键值对的值,底层实现是一个保存着字符串"hello world" 的SDS

    又比如,如果客户端执行命令:

    redis> RPUSH fruits "apple" "banana" "cherry"
    (integer) 3
    
    • 1
    • 2

    那么,Redis 将在数据库中 ,创建一个新的键值对,其中:
    1、键值对的键 是一个字符串对象,对象的底层保存着一个字符串"fruits “的SDS。
    2、键值对的值,是一个列表对象,列表对象中包含了3个字符串对象,这3个字符串对象分别由3个SDS实现: 分别保存着"apple” 、“banana” 、“cherry” 字符串对象。

    SDS除了用来保存数据库中的字符串值以外,SDS还被用作缓冲区:AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区,都是由SDS实现的,我会在别的章节中介绍AOF持久化和客户端状态的时候,可以看到SDS在这2个模块中的应用。

    下面将会对SDS的实现进行介绍,说明SDS和C字符串的不同之处,解释为什么Redis要使用SDS而不是C字符串,并且在最后给出SDS的操作api

    SDS实现介绍:
    链接: 2.1 SDS的定义
    链接: 2.2 SDS 与C字符串的区别

    链接: 2.3 SDS的API

  • 相关阅读:
    【lwip】09-IPv4协议&超全源码实现分析
    Scala编程基础——集合&高阶函数
    pytorch 学习第三天 交叉熵
    Web服务(10)——Tomcat服务
    极简工作流「GitHub 热点速览」
    使用Visual Studio Code编译PaddleOCR的C++代码
    代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、160.链表相交、142.环形链表II
    一道题开始认识Symbol
    Windows10/11:CLion配置WSL(ubuntu)终端完美解读
    定时器 | Spring Task 定时器
  • 原文地址:https://blog.csdn.net/helpluozhao123/article/details/128082898