前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis List(3)

Redis List(3)

作者头像
兜兜毛毛
发布2020-03-19 10:24:00
5600
发布2020-03-19 10:24:00
举报
文章被收录于专栏:兜兜毛毛兜兜毛毛

存储类型

存储(实现)原理

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

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

代码语言:javascript
复制
127.0.0.1:6379> lpush list a
(integer) 1
127.0.0.1:6379> lpush list b c
(integer) 3
127.0.0.1:6379> object encoding list
"quicklist"
quicklist

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

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

代码语言:javascript
复制
/* quicklist is a 40 byte struct (on 64-bit systems) describing a quicklist.
 * 'count' is the number of total entries.
 * 'len' is the number of quicklist nodes.
 * 'compress' is: -1 if compression disabled, otherwise it's the number
 *                of quicklistNodes to leave uncompressed at ends of quicklist.
 * 'fill' is the user-requested (or default) fill factor. */
typedef struct quicklist {
    quicklistNode *head; /*指向双向列表头*/
    quicklistNode *tail;  /*指向双向列表尾*/
    unsigned long count;        /* 所有 ziplists 中一共存了多少个元素*/
    unsigned long len;          /* 双向链表的长度,node数量 */
    int fill : 16;              /* fill factor for individual nodes */
    unsigned int compress : 16; /* 压缩深度 0: 不压缩 */
} quicklist;

redis.conf 相关配置: |参数|含义| |--|--| |list-max-ziplist-size(fill)|正数表示单个ziplist最多所包含的entry个数。负数代表单个ziplist的大小,默认8k。-1:4KB;-2:8KB;-3:16KB;-4:32KB;-5:64KB| |list-compress-depth(compress)|压缩深度,默认是0。1:首尾的ziplist不压缩;2:首尾第一第二个ziplist不压缩,以此类推|

quicklistNode中的*zl指向一个ziplist,一个ziplist可以存放多个元素。

代码语言:javascript
复制
/* quicklistNode is a 32 byte struct describing a ziplist for a quicklist.
 * We use bit fields keep the quicklistNode at 32 bytes.
 * count: 16 bits, max 65536 (max zl bytes is 65k, so max count actually < 32k).
 * encoding: 2 bits, RAW=1, LZF=2.
 * container: 2 bits, NONE=1, ZIPLIST=2.
 * recompress: 1 bit, bool, true if node is temporarry decompressed for usage.
 * attempted_compress: 1 bit, boolean, used for verifying during testing.
 * extra: 10 bits, free for future use; pads out the remainder of 32 bits */
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:RAW2:LZF */
    unsigned int container : 2;  /* 2:ziplist,未来可能支持其他结构存储 */
    unsigned int recompress : 1; /* 当前ziplist是不是已经被解压出来作临时使用 */
    unsigned int attempted_compress : 1; /* 测试用 */
    unsigned int extra : 10; /* 预留给未来使用 */
} quicklistNode;
应用场景
简单的消息队列(生产环境建议使用专业的MQ服务)

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

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

BRPOP:BRPOPkey1timeout移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

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

栈:先进后出:rpush brpop

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 存储(实现)原理
    • quicklist
      • 应用场景
        • 简单的消息队列(生产环境建议使用专业的MQ服务)
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档