Redis-学习之-数据结构-List

Redis-学习之-数据结构-List

首先我们学习一下List的一些命令
头插入、 获取

lpush key val1 val2
lpop key

尾插入 、 获取

rpush key val1 val2
rpop key

--------等等其它一下命令自行查博客-----
接下来我们学习一下底层实现

redis 的列表(list)底层实现

一句话概括: 列表键的底层实现就是一个链表,链表中的每个节点都保存了一个数值
数值是:可以是整数,字符,字符串,对象
上我们链表结构:

typedef struct list {
    // 表头节点
    listNode * head;
    // 表尾节点
    listNode * tail;
    // 链表所包含的节点数量
    unsigned long len;
// 节点值复制函数
    **void** *(*dup)(void *ptr);
    // 节点值释放函数
    **void** (*free)(void *ptr);
    // 节点值对比函数
    int (*match)(void *ptr,void *key);
} list;

listNode 代码结构:

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

接下来,我们对list进行一个讲解
比如我们

lpush list  1 2 "3 " 

这个时候key就是list, list的值就是 1,2,3三个完整的值
那么是怎么存储的呢?
list 就是代表了我们的 typedef struct list 这个结构体 ,
1,2,3这三个数据就是通过三个 listNode 存储关联;
总结:
list 这个东西,就是列表(源码是 list:listNode的关系); (他的底层是现是链表,源码是 listNode: pre、next、val)

listNode 就是底层实现的 链表节点
那么问题来了listNode到底存了我们什么值呢?
prenext 这两个就不用说了就是我们node的 基本属性,存前、后节点

listNode 中的value 到底是存什么值呢?
value 其实存我们 1 ,2,3 的sds对象 的值 ;
简单说就是 list 的三个值 其实就是一个字符串,字符串呢就会存到sds中,之前我们学习字符串建构的时候有说明,sds有几个属性len,free,arr[] 比如我们的 1 对应sds中 就是 len=1 free=1 arr=[‘1’,/0];

我们list 的key也是字符串,那么说我们的key也是存在 sds中,并且是放在
typedef struct list 中的val 中

最后我们来说一下 void 在这里表示啥呢?
void ,在redis中是一种多态,因为呢,list中可以是 数字,字符,字符串。。。

总结一下、list数据结构在我们工作中用途:

  1. 消息队列: 使用lpush插入 ,BRpop 进行尾消费,可以当做消息队列
  2. 可以进行分页: 使用 LRANGE key start stop ,进行分页查询
  3. 进行数据排行榜展示,定时对list中数据进行排序后,查询出前10条
    LRANGE list 0 9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值