redis数据类型--list

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;
应用场景
消息队列
List 提供了两个阻塞的弹出操作:BLPOP/BRPOP,可以设置超时时间。
BLPOP:BLPOP key1 timeout 移出并获取列表的第一个元素, 如果列表没有元素
会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOP:BRPOP key1 timeout 移出并获取列表的最后一个元素, 如果列表没有元
素会阻塞列表直到等待超时或发现可弹出元素为止。
队列:先进先出:rpush blpop,左头右尾,右边进入队列,左边出队列。
栈:先进后出:rpush brpop

posted on 2019-10-29 18:30  冰龙之剑  阅读(398)  评论(0编辑  收藏  举报

导航