一、概述
redis的列表类型可以存储一个有序的字符串列表,内部实现是一个双向链表,允许用户从两端插入元素。所以向两端插入数据的速度是极快的,而且获取数据时也是越接近两端速度越快,一个列表最多能容纳2^32 - 1
个元素。
二、命令
2.1 在两端插入元素
LPUSH key value [value ...]
:在列表的左端插入元素。RPUSH key value [value ...]
:在列表的右端插入元素。
返回值表示增加元素后的列表长度。
1 2 3 4 |
127.0.0.1:6379> lpush k aaa bbb ccc (integer) 3 127.0.0.1:6379> rpush k ddd eee fff (integer) 6 |
2.2 查询元素
LRANGE key start end
:获取[start, end]
区间的元素。
索引是从0
开始,可用-1表示最后一个元素。
1 2 3 4 5 6 7 |
127.0.0.1:6379> lrange k 0 5 # 等价于lange k 0 -1 1) "ccc" 2) "bbb" 3) "aaa" 4) "ddd" 5) "eee" 6) "fff |
2.3 弹出元素
RPOP key
:弹出并返回最右边的元素。LPOP key
:弹出并返回最左边的元素。
1 2 3 4 5 6 7 8 9 |
127.0.0.1:6379> lpop k "ccc" 127.0.0.1:6379> rpop k "fff" 127.0.0.1:6379> lrange k 0 -1 1) "bbb" 2) "aaa" 3) "ddd" 4) "eee" |
2.4 索引操作
LINDEX key offset
:获取索引为offset的元素。LSET key index value
:设置索引为index的数据为value,索引从0开始。。LINSERT key BEFORE|AFTER pivot value
:在pivot前面或者后面插入值。
索引都是从0开始,LINDEX
命令中offset<0
时从右边开始计算索引。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
127.0.0.1:6379> lindex k 1 "aaa" 127.0.0.1:6379> lset k 1 maqian # 设置索引=1的元素值为maqian OK 127.0.0.1:6379> lindex k 1 "maqian" 127.0.0.1:6379> linsert k before maqian hello # 在maqian前插入hello (integer) 5 127.0.0.1:6379> lrange k 0 -1 1) "bbb" 2) "hello" 3) "maqian" 4) "ddd" 5) "eee" |
2.5 获取列表长度
LLEN key
:获取列表的长度。
1 2 |
127.0.0.1:6379> llen k (integer) 5 |
2.6 删除元素
LREM key count value
:删除count个值为value的元素,返回成功删除的元素个数。当count<0
时从右边开始删除,当count>0
时从左边开始删,当count=0
时删除所有的value 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
127.0.0.1:6379> lpush listKey aaa bbb ccc ddd ddd ccc bbb aaa bbb ddd (integer) 10 127.0.0.1:6379> lrange listKey 0 -1 1) "ddd" 2) "bbb" 3) "aaa" 4) "bbb" 5) "ccc" 6) "ddd" 7) "ddd" 8) "ccc" 9) "bbb" 10) "aaa" 127.0.0.1:6379> lrem listKey 2 bbb # 从左边开始删除两个bbb (integer) 2 127.0.0.1:6379> lrange listKey 0 -1 1) "ddd" 2) "aaa" 3) "ccc" 4) "ddd" 5) "ddd" 6) "ccc" 7) "bbb" 8) "aaa" 127.0.0.1:6379> lrem listKey -2 ddd # 从右边开始删除两个ddd (integer) 2 127.0.0.1:6379> lrange listKey 0 -1 1) "ddd" 2) "aaa" 3) "ccc" 4) "ccc" 5) "bbb" 6) "aaa" 127.0.0.1:6379> lrem listKey 0 aaa # 删除所有的aaa (integer) 2 127.0.0.1:6379> lrange listKey 0 -1 1) "ddd" 2) "ccc" 3) "ccc" 4) "bbb" |
2.7 修剪元素
-
LTRIM key start end
:修剪列表元素,只保留[start, end]
区间的元素。
1 2 3 4 5 |
127.0.0.1:6379> ltrim listKey 1 2 OK 127.0.0.1:6379> lrange listKey 0 -1 1) "ccc" 2) "ccc" |
2.8 转移元素到另一个列表
RPOPLPUSH src dest
:从src
中弹出最右边的元素并插入到dest
的左边,整个过程是原子的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
127.0.0.1:6379> lpush keyA aaa bbb ccc (integer) 3 127.0.0.1:6379> lpush keyB ddd eee fff (integer) 3 127.0.0.1:6379> rpoplpush keyA keyB "aaa" 127.0.0.1:6379> lrange keyA 0 -1 1) "ccc" 2) "bbb" 127.0.0.1:6379> lrange keyB 0 -1 1) "aaa" 2) "fff" 3) "eee" 4) "ddd" |
2.9 阻塞式命令
BLPOP/BRPOP key [key ...] timeout
:从列表key
中弹出最左端或者最右端的元素,如果列表中 没有元素,将一直等待timeout
时间直到列表中有元素,timeout=0
表示不限制超时时间,返回列表名和弹出的元素。BRPOPLPUSH src dest timeouit
:从src
中弹出元素并存到dest
中,会阻塞timeout
时间。
开启两个redis终端,第一个终端阻塞弹出:
1 2 |
127.0.0.1:6379> brpop msgList 0 # 此时终端会阻塞在这里 |
第二个终端插入元素:
1 2 |
127.0.0.1:6379> lpush msgList 123 456 # 插入两个元素123 456 (integer) 2 |
此时第一个终端将会返回数据:
1 2 3 4 |
127.0.0.1:6379> brpop msgList 0 1) "msgList" 2) "123" (87.24s) |
再次输入命令brpop msgList 0
,此时会立马弹出456,因为列表中存在456:
1 2 3 |
127.0.0.1:6379> brpop msgList 0 1) "msgList" 2) "456" |
评论