redis中的list是有序的、可以重复的。

1、命令(xxx可以是一个任意字符串)

lpush (从左边压入)例子:lpush xxx a b c

rpush (从有变压入)例子:rpush xxx aaa

lpop (从左边弹出)例子:lpop xxx

rpop (从右边弹出)例子:rpop xxx

blpop xxx (没有消息的时候会阻塞住直到消息到来)

brpop xxx

 

取值:

lindex xxx 0 (取左边第一个)

lrange xxx 0 -1 (取所有,0 -1是所有)

 

存储(实现)原理

在早期的版本中,数据量较小时用 ziplist 存储,达到临界值时转换为 linkedlist 进行存储,分别对应 OBJ_ENCODING_ZIPLIST 和 OBJ_ENCODING_LINKEDLIST 。

3.2 版本之后,统一用 quicklist 来存储。quicklist 存储了一个双向链表,每个节点都是一个 ziplist。

 

quicklist

quicklist(快速列表)是 ziplist 和 linkedlist 的结合体。

quicklist.h,head 和 tail 指向双向列表的表头和表尾。

typedef struct quicklist {

quicklistNode *head; /* 指向双向列表的表头 */

quicklistNode *tail; /* 指向双向列表的表尾 */

unsigned long count; /* 所有的 ziplist 中一共存了多少个元素 */

unsigned long len; /* 双向链表的长度,node 的数量 */

int fill : 16; /* fill factor for individual nodes */

unsigned int compress : 16; /* 压缩深度,0:不压缩; */

} quicklist;

redis 队列重复执行 redis list可以重复吗_字符串

应用场景

消息队列

List 提供了两个阻塞的弹出操作:BLPOP/BRPOP,可以设置超时时间。

BLPOP:BLPOP key1 timeout 移出并获取列表的第一个元素, 如果列表没有元素

会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOP:BRPOP key1 timeout 移出并获取列表的最后一个元素, 如果列表没有元

素会阻塞列表直到等待超时或发现可弹出元素为止。

队列:先进先出:rpush blpop,左头右尾,右边进入队列,左边出队列。

栈:先进后出:rpush brpop