• Redis数据结构和类型


    Redis 包含五种数据类型,分别为String、List、Hash、Set、ZSet

    底层实现的数据结构包SDS、双向链表、压缩列表、哈希表、整数集合、跳表

    • redis结构图

    • 数据类型和数据结构的关系

    Redis六种数据结构

    一、动态字符串(SDS)

    Redis 是用 C 语言实现的,但是它没有直接使用 C 语言的 char* 字符数组来实现字符串,而是自己封装了一个名为简单动态字符串(simple dynamic string,SDS) 的数据结构来表示字符串,也就是 Redis 的 String 数据类型的底层数据结构是 SDS

    总的来说,Redis 的 SDS 结构在原本字符数组之上,增加了三个元数据:len、alloc、flags,用来解决 C 语言字符串的缺陷,之所以 SDS 设计不同类型的结构体,是为了能灵活保存不同大小的字符串,从而有效节省内存空间。比如,在保存小字符串时,结构头占用空间也比较少

    优点:

    • 获取字符串长度复杂度:C 语言的字符串长度获取 strlen 函数,复杂度是O(n),而 Redis 的 SDS 结构因为加入了 len 成员变量,所以是O(1)
    • 二进制安全:因为 SDS 不需要用 “\0” 字符来标识字符串结尾了
    • 不会发生缓冲区溢出:C 语言的字符串标准库提供的字符串操作函数,大多数(比如 strcat 追加字符串函数)都是不安全的,Redis 的 SDS 结构里引入了 alloc 和 leb 成员变量,这样 SDS API 通过 alloc - len 计算,可以算出剩余可用的空间大小,这样在对字符串做修改操作的时候,就可以由程序内部判断缓冲区大小是否足够用
    • 节省内存空间:SDS 结构中有个 flags 成员变量,表示的是 SDS 类型,之所以 SDS 设计不同类型的结构体,是为了能灵活保存不同大小的字符串,从而有效节省内存空间。比如,在保存小字符串时,结构头占用空间也比较少

    二、链表(linkedlist)

  • 相关阅读:
    SpringBoot实现多数据源(四)【集成多个 Mybatis 框架】
    BGP基础讲解
    【C++】STL梳理
    Linux内核顶层Makefile的make过程说明二
    postgres Full Page Write全页写机制
    区间映射算法
    大模型日报|11 篇必读的大模型论文
    Ceres学习笔记001--初识Ceres
    夜神模拟器进行APP抓包
    springboot实战(七)之jackson配置前后端交互下划线转驼峰&对象序列化与反序列化
  • 原文地址:https://blog.csdn.net/surpass0728/article/details/128108088