Redis List(3)

存储类型

存储(实现)原理

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

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

1127.0.0.1:6379> lpush list a 2(integer) 1 3127.0.0.1:6379> lpush list b c 4(integer) 3 5127.0.0.1:6379> object encoding list 6"quicklist"

quicklist

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

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

1/* quicklist is a 40 byte struct (on 64-bit systems) describing a quicklist. 2 * 'count' is the number of total entries. 3 * 'len' is the number of quicklist nodes. 4 * 'compress' is: -1 if compression disabled, otherwise it's the number 5 * of quicklistNodes to leave uncompressed at ends of quicklist. 6 * 'fill' is the user-requested (or default) fill factor. */ 7typedef struct quicklist { 8 quicklistNode *head; /*指向双向列表头*/ 9 quicklistNode *tail; /*指向双向列表尾*/ 10 unsigned long count; /* 所有 ziplists 中一共存了多少个元素*/ 11 unsigned long len; /* 双向链表的长度,node数量 */ 12 int fill : 16; /* fill factor for individual nodes */ 13 unsigned int compress : 16; /* 压缩深度 0: 不压缩 */ 14} 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可以存放多个元素。

1/* quicklistNode is a 32 byte struct describing a ziplist for a quicklist. 2 * We use bit fields keep the quicklistNode at 32 bytes. 3 * count: 16 bits, max 65536 (max zl bytes is 65k, so max count actually < 32k). 4 * encoding: 2 bits, RAW=1, LZF=2. 5 * container: 2 bits, NONE=1, ZIPLIST=2. 6 * recompress: 1 bit, bool, true if node is temporarry decompressed for usage. 7 * attempted_compress: 1 bit, boolean, used for verifying during testing. 8 * extra: 10 bits, free for future use; pads out the remainder of 32 bits */ 9typedef struct quicklistNode { 10 struct quicklistNode *prev; /*前一个节点*/ 11 struct quicklistNode *next; /*后一个节点*/ 12 unsigned char *zl; /*指向实际的ziplist*/ 13 unsigned int sz; /* 当前ziplist占用多少字节 */ 14 unsigned int count : 16; /* 当前ziplist中存储了多少个元素,占16bit(下同),最大65536个 */ 15 unsigned int encoding : 2; /* 是否采用了LZF压缩算法压缩节点,1:RAW2:LZF */ 16 unsigned int container : 2; /* 2:ziplist,未来可能支持其他结构存储 */ 17 unsigned int recompress : 1; /* 当前ziplist是不是已经被解压出来作临时使用 */ 18 unsigned int attempted_compress : 1; /* 测试用 */ 19 unsigned int extra : 10; /* 预留给未来使用 */ 20} quicklistNode;

应用场景

简单的消息队列(生产环境建议使用专业的MQ服务)

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

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

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

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

栈:先进后出:rpush brpop

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid