Redis学习笔记 一、Redis数据结构和底层原理

1、简单动态字符串SDS

  • 应用:

    • 字符串对象底层实现

    • 缓冲区(AOF,客户端状态中的输入缓冲区)

  • 数据结构:

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

在这里插入图片描述

  • 特性:

    • 取字符串长度O(1);
    • 二进制安全:有len记录长度,相比C语言,字符串中间遇到’\0’不会中断;
    • 杜绝缓存溢出-检查容量、自己扩容;
    • 减少修改字符串长度时所需内存重分配次数-空间预分配(SDS增长,N次增长最多N次扩容)、惰性空间释放(SDS减少,不释放内存,用free记录);
    • 兼容部分C字符串函数。
    • 唯一一种可以被其他四种对象嵌套的对象。

2、链表-list

  • 应用:

    • 列表键的底层实现:列表元素数量多、元素是长字符串;
    • 发布、订阅、慢查询、监视器;
  • 数据结构:

    多个listNode组成一个list,listNode通过前后指针形成双端链表;

    adlist.h/listNode

    typedef struct listNode {
         
        // 前置节点
        struct listNode *prev;
        // 后置节点
        struct listNode *next;
        // 节点的值
        void *value;
    } listNode;
    

    adlist.h/list

    typedef struct list {
         
        // 表头节点
        listNode *head;
        // 表尾节点
        listNode *tail;
        // 链表所包含的节点数量
        unsigned long len;
        // 节点值复制函数
        void *(*dup
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值