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到底存了我们什么值呢? pre、next 这两个就不用说了就是我们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数据结构在我们工作中用途:
- 消息队列: 使用lpush插入 ,BRpop 进行尾消费,可以当做消息队列
- 可以进行分页: 使用 LRANGE key start stop ,进行分页查询
- 进行数据排行榜展示,定时对list中数据进行排序后,查询出前10条
LRANGE list 0 9
|