源码位置:t_list.c/server.h
Redis3.2 版本之前,list 对象底层是由 ziplist 和 linkedlist 实现的。3.2 版本之后,底层是由 quicklist 来实现。
命令 | 功能 | 时间复杂度 |
---|---|---|
LPUSH | 从列表的最左边插入一个或多个元素(列表为空则创建) | O(1) |
LRUSHX | 从列表的最左边插入一个或多个元素(列表为空时不做操作) | O(1) |
RPUSH | 从列表的最右边插入一个或多个元素(列表为空则创建) | O(1) |
RPUSHX | 从列表的最右边插入一个或多个元素(列表为空时不做操作) | O(1) |
LPOP | 从列表的最左边弹出一个元素 | O(1) |
RPOP | 从列表的最右边弹出一个元素 | O(1) |
BLPOP | 弹出指定的多个列表中第一个元素(lpop 阻塞版本) | O(1) |
BRPOP | 弹出指定的多个列表中最后一个元素(rpop 阻塞版本) | O(1) |
RPOPLPUSH | 弹出列表 A 的最后一个元素,并将该元素插入到列表 B 的首位 | O(1) |
BRPOPLPUSH | 弹出列表 A 的最后一个元素,并将该元素插入到列表 B 的首位(rpoplpush 阻塞版本) | O(1) |
LINDEX | 获取索引位置的元素 | 平均 O(N),头尾 O(1) |
LRANGE | 从列表中获取指定位置的元素 | O(S+N),S 是距离列表头部的偏移位置,N 为指定范围元素数 |
LINSERT | 在列表中的另一个元素前或后插入一个元素 | 平均 O(N),头部 O(1) |
LSET | 设置 index 位置元素的值为 value | 平均 O(N),头尾 O(1) |
LTRIM | 修剪一个已存在的列表的大小 | 平均 O(N) |
LREM | 从列表中移除 count 个值为 value 的元素 | O(N) |
LLEN | 获得列表的长度 | O(1) |
函数功能总览
1 | void blpopCommand(client *c); // blpop命令 |
Redis 命令实现
插入命令:
1 | LPUSH key value [value ...] |
代码:
1 | void lpushCommand(client *c) { |
其他与插入相关的命令不做代码解析了,可自行查看源码。
1 | LPUSHX key value // 如果db中有该列表,则调用quicklistPush插入元素到列表头部,无列表则不做操作返回 |
弹出命令:
1 | LPOP key |
代码:
1 | void lpopCommand(client *c) { |
其他与插入相关的命令不做代码解析了,可自行查看源码。
1 | BLPOP key [key ...] timeout |
获取元素命令:
1 | LINDEX key index |
代码:
1 | // LINDEX |
其他命令:
1 | LTRIM key start stop |
代码:
1 | void ltrimCommand(client *c) { |