redis数据类型对应底层数据结构

redis数据类型对应底层数据结构

参考链接:https://blog.csdn.net/qq_35549286/article/details/126639070

redis常用数据类型

  • string

    • string类型的编码方式有三种,即encoding有三种:int , embstr,raw
      • value的值是整数,encoding对应的是int,没有特殊底层数据结构
      • value长度小于32,对应encoding为embstr,长度大于32对应的encoding是raw;embstr和raw对应的底层数据结构都是sds(简单动态字符串)
      • SDS 对应数据结构为:
        struct sdshdr{
        int len; // 字符串长度
        int free; // 未使用的字节长度
        char buf[]; // 保存字符串的字节数组
        }
  • hash

    • 当哈希对象的键值对个数小于512,并且所有键值对的长度都小于64字节时,使用压缩列表ziplist,否则使用hashtable
  • list

    • 当列表的长度小于512,并且所有元素的长度都小于64字节时,使用压缩列表,否则使用linkedlist,redis3.2以后统一使用quicklist
  • set

    • 如果集合中所有元素都可以转换成整数,并且长度小于512时,使用intset,否则使用hashtable.
  • zset

    • 当集合元素个数小于128,并且所有元素长度都小于64字节时,使用压缩列表,否则使用skiplist

使用到的数据结构总结

  • 压缩列表
    • 压缩列表并不是说以某种算法压缩存储数据,它是一组连续的内存块,能够节省空间。
    • 压缩列表的内存结构:
      • zlbytes:占用4个字节,是压缩列表占用内存的字节数
      • zltail:4个字节大小,记录表未节点距离起始地址的偏移量,用于快速定位尾节点位置
      • zllen:2个字节大小,用于存储总共节点个数
      • entry: 列表中的每一个元素
        • previous_entry_ength:记录前一个entry节点的长度,用于快速寻找上一个元素的起始位置,因为他们是连续的
        • encoding: content的内容类型和长度
        • content: 每个节点的内容
      • zlend: 压缩列表的结束语’0xFF’
  • hashtable
    • 类似java中的hashmap
  • linkedlist,quicklist
    • 双向链表
  • intset:整数集合
    • 元素:
      • encoding: 编码方式,有INTSET_ENC_INT16,INTSET_ENC_INT32,INTSET_ENC_INT64三种
      • contents[]:元素内容
      • length: 元素内容长度
    • 整数集合若是超过了的长度,就会进行扩容:
      • 扩展数组contents的大小,并且数组的类型转化为新元素的类型
      • 将原来数据中的元素转换为新元素的类型,并且放到新的数组中
      • 整数集合在升级后不会降级,会一直保持升级后的状态
  • skiplist: 跳跃表
    • 跳跃表是具有多层结构的链表
    • 由很多层组成,每一层都是一个有序的列表
    • 由上到下每层数据逐渐密集,最上层的节点最稀疏,最下层的节点最密集
    • 每一层的每一个节点都指向同一层的下一个节点,以及上一层的同一个位置的节点
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值