【redis前传】 redis五大天王值list基本数据如何成长 | 由内之外深入学习

 

前言

  • 在【数据结构】学习中,绕不过的就是链表和数组的学习了!数组应该更容易理解点!因为他和我们平时的逻辑一样。但是链表在刚入门的同学中应该算是比较抽象的了!尤其是指针交换位置更是容一部分同学望而却步!
  • 今天我们来学习下Redis中的常用的链表数据结构

list

  • Redis低版本(3.2之前)中list数据结构底层就是使用链表来进行串联数据的!

image-20210621154225866

  • 上图就是Redis中在操作List数据结构时的结构图!在redis中并不是仅仅使用这一种双向的链表结构.关于ziplist等其他结构我们这里暂时不讨论。
  • 而针对一整条链条redis有将它 抽象化一个list对象

image-20210621154708172

  • node是链条中重要的组成部分,而list我们可以理解成对整个链条的描述。list中包含头结点、尾结点、链条中节点个数、节点的复制释放比对等功能!
typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

typedef struct listIter {
    listNode *next;
    int direction;
} listIter;

typedef struct list {
    listNode *head;
    listNode *tail;
    void *(*dup)(void *ptr);
    void (*free)(void *ptr);
    int (*match)(void *ptr, void *key);
    unsigned long len;
} list;
函数作用
dup复制链表节点值
free释放链表节点值
match比对链表节点值与指定值是否想的相等

image-20210621155615574

小结

  • 很明显在redis中链表是一种双指针链表,可以通过当前节点轻松定位前后节点!
  • list中可以轻松获取链表头尾节点!这也就解释redis中的lpush 、 rpush命令最终的实现了。就是通过改变头、尾指针就可以了。操作那是非常迅速的
  • list中len表示链表长度。就是一个节点计数器。对应着llen 命令
  • 了解数据结构后基本上就可以理解redis对应的操作命令在内存中的结构了

list其他数据结构

  • 上面我们提到在3.2之前的版本中redis采用链表结构进行存储list数据。在3.2之后开始出现一种ziplist结构的数据结构!
  • 首先我们思考下listnode用的好好的为什么要改用ziplist结构。因为list结构中存储了头尾节点方便了我们寻址但是牺牲了内存说白了就是空间换时间
  • ziplist就是针对内存浪费的问题进行了优化。
  • 我們看下ziplist的存储内存分布图(以下图片来源于网络)

image-20210621173157390

位置作用
zlbytesziplist字节长度;长度最长为(2^32)-1
zltail整个ziplist偏移量;四个字节
zllenziplist中存储的元素个数;两个字节
entryXziplist中元素
zlend结束位 。固定值0xFF=255
typedef struct zlentry {
    unsigned int prevrawlensize, prevrawlen;
    unsigned int lensize, len;
    unsigned int headersize;
    unsigned char encoding;
    unsigned char *p;
} zlentry;

小结

  • ziplist又称为压缩列表本质上就是一个数组。除了list以外还有hash也都使用了ziplist. 压缩列表虽然节省了内存的开销但是随之而来的问题就是连锁更新。关于什么是连锁更新我们以后在分析!本文是一篇入门级的文章。

欢迎点个赞呗

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值