redis的list类型是用来存储多个有序的字符串,属于线性结构一对一的关系!列表当中的每一个字符看做一个元素,一个列表中可以存储一个或者多个元素,支持存储2^32次方-1个元素,大致相当于4GB;
redis的list类型基于双端链表和压缩列表实现!
双端链表的实现由 listNode 和 list 两个数据结构构成:
其中, listNode 是双端链表的节点:
typedef struct listNode {
// 前驱节点
struct listNode *prev;
// 后继节点
struct listNode *next;
// 值
void *value;
} listNode;
而 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;
可以理解为上述list为逻辑结构本身,listnode是取list结构的方法!
Ziplist 是由一系列特殊编码的内存块构成的列表, 一个 ziplist 可以包含多个节点(entry);也就是当前节点保存了上一个节点与下一个节点的地址,list数据类型遍历时就是根据其保存的上下关系进行遍历!
lpush从头插入 rpush 从尾插入 取也与之相同 !
应用场景:
一是可以做消息队列 例如 think-queue 就是基于redis的list类型做消息队列的投递工作!
二是秒杀抢购功能,可以解决超卖高并发恶意请求等问题!
三是可以做不经常变化的排行榜