redis--list列表---linklist
1. list
redis的list分为两种结构,linklist(链表)和ziplist(压缩列表)
2.什么时候使用使用linklist
当list元素个数多,或者元素内容长度大的时候采用linklist
3.linklist结构
node结构
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
}listNode;
链表结构(双端链表)
typedef struct list {
listNode *head; //头节点
listNode *tail; //尾节点
void *(*dup)(void *ptr); //节点复制函数
void *(*free)(void * ptr); //节点释放函数
int (*match)(void * ptr, void *key); //节点对比函数
unsigned long len; //链表长度
}list;
4.特性
a. 双端:链表具有前置节点和后置节点的引用,获取这两个时间复杂度都为O(1)
b. 无环:表头节点的prev指针和表尾节点的next指针都指向null,对链表的访问都是以null结束
c. 带链表长度计数器:通过len属性获取链表长度的时间复杂度为O(1)
d. 多态:链表节点用void* 指针来保存节点值,可以保存不同类型的值
5. 结构图解

6. list的命令
a. blpop
blpop list1 [list2] timeout 移出并获取列表的第一个元素,如果列表没有元素会阻塞列表知道等待超时或发现可弹出元素为止
b. brpop
brpop list1[list2] timeout 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表知道等待超时或发现可弹出元素为止
c. lindex
lindex list index 通过索引获取列表中的元素
d. linsert
linsert list before|after pivot value 在列表的pivot元素前或者后插入元素
e. llen
llen list 获取列表长度
f. lpop
lpop list 移出并获取列表的第一个元素,如果list不存在元素则返回nil(类似null)
g. lpush
lpush list value1[value2] 将一个或者多个值插入到列表的头部,返回列表的长度
h. lpushx
lpushx list value 将一个值插入到已存在的列表头部,返回列表的长度
i. lrange
lrange list start end 返回区间以偏移量start和end指定的元素。其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
j. lrem
lrem list count value 移出列表元素,根据count的值,移除列表中与参数value相等的值。count>0,从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT ;count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值;count = 0 : 移除表中所有与 VALUE 相等的值。
返回:被移除元素的数量。 列表不存在时返回 0 。
k. lset
lset list index value 通过索引设置列表元素的值。当索引参数超出范围,或对一个空列表进行lset时,返回一个错误,操作成功返回OK
l. ltrim
ltrim list start end 对一个列表进行修剪。让列表只保留指定区间内的元素,不在指定区间则被删除。成功返回OK
m. rpop
rpop list 移出列表的最后一个元素,返回值为移除的元素
n. rpoplpush
rpoplpush source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回,返回被弹出的元素
o. rpush
rpush list value1 [value2] 在列表中添加一个或多个值
p. rpushx
rpushx list value 为已存在的列表添加值

浙公网安备 33010602011771号