redis:List
1、前言
与Java中的LinkedList类似,可以看做一个双向链表,同时支持正反向检索。
List用于存储多个有序字符串,List中存放的每个字符串称为元素,一个List最多可以存储2^32-1个元素。
有序:可以通过下表的方式获取元素或者某个范围内的元素List
在Redis中,可以在List两端进行插入(Push)和弹出(Pop)、获取指定位置、指定范围的元素。
特征:
- 有序
- 元素可重复
- 增删速度快
- 查询速度一般
内部编码
List有两种内部编码:
- ziplist(压缩列表):当List元素个数 < list-max-ziplist-entries(默认512),同时每个元素的V值都< list-max-ziplist-value(默认64B),使用ziplist作为List的内部实现;
- linkedlist(链表):当List无法满足ziplist的条件,转而使用linkedlist。
2、常用命令
命令 |
用法 |
说明 |
lpush rpush |
lpush/rpush K V1 V2 V3 | 往K的左/右插入V |
lpop rpop |
lpop/rpop K | 从K的左/右移除一个V |
llen | llen K | K中元素个数 |
lrange | lrange K start end |
返回K中从start到end区间内的元素 使用非负下标时:以0为第一个元素,1为第二个元素 使用负数下标时:以-1为最后一个元素,-2为倒数第二个元素 当start为0,end为-1时,代表全部 |
lindex | lindex K n |
返回下标为n的元素 可用负数,以-1为最后一个元素,-2为倒数第二个元素 |
ltrim | ltrim K start end |
只保留在区间start到end的元素,删除不在指定区间的。 下标写法同上 |
blpop brpop |
blpop K [K2 K3 ...] timeout |
阻塞式弹出 |
1、插入
用法
- rpush K V [V2 V3 ...]:右插
- lpush K V [V2 V3 ...]:左插
说明
如果有多个V,则V的分布为(从左到右/从右到左,可以理解为把这些元素当做一个List/反List,整体插入)2、lrange:取区间内的元素
用法:lrange K start stop
说明
- 区间以偏移量 start 和 stop 指定;
- 下标(index)参数 start 和 stop 都以 0 为底,即 0 表示列表中的第一个元素,1 表示列表的第二个元素,以此类推;
- 使用负数下标时,以 -1 表示列表的最后一个元素,-2 表示列表的倒数第二个元素,以此类推;
- 当start为0,end为-1时,代表全部。
3、linsert:元素前后插入
用法:linsert K before/after V V2
说明
- 往K中V的左/右插入新值V2
- 这里的V是指元素值,而非下标
返回值
新list的长度
例子
往元素b前插入元素java
127.0.0.1:6379> linsert listkey before b java (integer) 4
4、lindex:获取指定索引的元素
用法:lindex K index
说明
- 相当于list[index]
- 0代表第一个元素
- 使用负数下标时,-1代表最后一个元素
5、llen:list长度
用法:llen K
6、lpop/rpop:弹出
用法:
- lpop K
- rpop K
7、lrem:定向删除
用法
- lrem K count V
说明
- 删除list中的所有V
- count>0,从左到右,最多count个;
- count<0,从右到左,最多count个;
- count=0,全部
8、ltrim:修剪,保留指定区间内的元素,删除不在区间内的元素
用法:ltrim K start end
说明:
- start和end的用法和前边所说相同
9、lset:修改指定下标处的元素
用法:lset K index newV
说明
- 将list[index]的值修改为newV
10、blpop/brpop:阻塞式弹出
用法:
- blpop K [K2 K3 ...] timeout
- brpop K [K2 K3 ...] timeout
参数
- K [K2 K3 ...]:多个list的K
- timeout:阻塞时间(s)
说明
关于timeout的用法:
- List不空:立刻返回
brpop list:test 0 1) "list:test" 2) "element1"
- List为空:
- timeout=0:一直阻塞
- timeout≠0:阻塞指定时间后返回
-
brpop list:test 3 (nil) (3.10s) brpop list:test 0 ...阻塞...
- 如果一次指定了多个K,那么只要其中有一个能返回就不会阻塞
- 如果一次指定了多个K,且K都为空,依次往它们中加入元素,那么会返回最先加入的那个
- 如果多个客户端对同一个K执行brpop,那么最先执行brpop命令的客户端可以获取到pop的值
client-1> brpop list:test 0 ...阻塞... client-2> brpop list:test 0 ...阻塞... client-3> brpop list:test 0 ...阻塞... client-lpush> lpush list:test element (integer) 1 //client1会获取到元素,因为客户端1最先执行brpop,剩下两个继续阻塞 client-1> brpop list:test 0 1) "list:test" 2) "element"