【愚公系列】2022年05月 .NET架构班 048-分布式中间件 Redis存储原理之List

举报
愚公搬代码 发表于 2022/05/02 11:52:26 2022/05/02
【摘要】 前言Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。存储有序的字符串(从左到右),元素可以重复。可以充当队列和栈的角色。 一、Redis存储原理之List 1.List结构List主要是用quicklist 来存储。quicklist 存储了一个双向链表,每个节点都是一个 ziplist。quicklist 结构如下:typed...

前言

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

存储有序的字符串(从左到右),元素可以重复。可以充当队列和栈的角色。

一、Redis存储原理之List

1.List结构

在这里插入图片描述
List主要是用quicklist 来存储。quicklist 存储了一个双向链表,每个节点都是一个 ziplist。

quicklist 结构如下:

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;

ziplist 结构如下:

typedef struct quicklistNode { 
struct quicklistNode *prev; /* 前一个节点 */ 
struct quicklistNode *next; /* 后一个节点 */ 
unsigned char *zl; /* 指向实际的 ziplist */ 
unsigned int sz; /* 当前 ziplist 占用多少字节 */ 
unsigned int count : 16; /* 当前 ziplist 中存储了多少个元素,占 16bit(下同),最大 65536 个 */ 
unsigned int encoding : 2; /* 是否采用了 LZF 压缩算法压缩节点,1:RAW 2:LZF */ unsigned int container : 2; /* 2:ziplist,未来可能支持其他结构存储 */ 
unsigned int recompress : 1; /* 当前 ziplist 是不是已经被解压出来作临时使用 */ 
unsigned int attempted_compress : 1; /* 测试用 */ 
unsigned int extra : 10; /* 预留给未来使用 */ 
} quicklistNode;

2.List编码类型

List的编码有三种:

  • int:存储 8 个字节的长整型(long,2^63-1)。大小超过了 long 的范围
    (2^63-1=9223372036854775807)时会自动转成embstr。
  • embstr:代表 embstr 格式的 SDS(Simple Dynamic String 简单动态字符串), 存储小于 44
    个字节的字符串。分配一次内存空间,而且是只读的。
  • raw:存储大于 44 个字节的字符串(3.2 版本之前是 39 字节)。分配二次内存空间。

3.应用场景

场景 说明
用户消息时间线 timeline 因为 List 是有序的,可以用来做用户时间线
消息队列 队列、栈

4.相关操作命令

# 从左边增加元素
lpush queue a 
lpush queue b c
# 从右边增加元素
rpush queue d e
# 删除链表左边的第一个元素
lpop queue 
# 删除链表右边的第一个元素
rpop queue

# 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
blpop queue 
brpop queue

# 用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
lindex queue 0 
lrange queue 0 -1

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。