【愚公系列】2022年05月 .NET架构班 048-分布式中间件 Redis存储原理之List
【摘要】 前言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)