1. List简介
Redis中List是基于Linked List实现,双向无环链表,其中元素是字符串类型。特点:
- 列表头尾增删快,中间增删慢,增删元素是常态
- 元素可以重复出现
- 最多包含232-1元素
双向链表添加删除元素示意图:
增.png
删.png
同时List还具有索引,索引顺序: - 从左至右,从0开始
-
从右至左,从-1开始
索引.png
2. List指令
2.1 增加元素
- 从左边增加
lpush key value [value ...]
127.0.0.1:6379> lpush fruits apple
1
127.0.0.1:6379> lpush fruits pear banana
3
127.0.0.1:6379>
- 从右边添加
rpush key value [value ...]
127.0.0.1:6379> rpush fruits orange
4
127.0.0.1:6379>
2.2 查看元素
lrange key start stop
命令返回start、stop索引之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:-1
代表最后边的一个元素。
127.0.0.1:6379> lrange fruits 0 -1
banana
pear
apple
orange
127.0.0.1:6379>
2.3 获取列表中元素的个数
llen key
127.0.0.1:6379> llen fruits
4
127.0.0.1:6379>
2.4 取出元素
- 从左边取出元素,并返回
lpop key
- 从右边取出元素,并返回
rpop key
127.0.0.1:6379> lpop fruits
banana
127.0.0.1:6379> rpop fruits
orange
127.0.0.1:6379>
2.5 元素从一个列表转移到另一个列表中
rpoplpush source dest
127.0.0.1:6379> lpush fruits banana
3
127.0.0.1:6379> rpush fruits orange
4
127.0.0.1:6379> lrange fruits 0 -1
banana
pear
apple
orange
127.0.0.1:6379> rpoplpush fruits list1
orange
127.0.0.1:6379> lrange list1 0 -1
orange
127.0.0.1:6379> lrange fruits 0 -1
banana
pear
apple
127.0.0.1:6379>
2.6 获取、设定指定位置的元素
- 获取
lindex key index
- 设定
lset key index value
127.0.0.1:6379> lrange fruits 0 -1
banana
pear
apple
banana
127.0.0.1:6379> lindex fruits 1
pear
127.0.0.1:6379> lset fruits 2 apples
OK
127.0.0.1:6379> lrange fruits 0 -1
banana
pear
apples
banana
127.0.0.1:6379>
2.7 删除List中指定元素
lrem key count value
从列表头部开始删除值等于value的元素count次
- count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
- count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
- count = 0 : 移除表中所有与 value 相等的值
127.0.0.1:6379> lpush list2 a b c c b a a b c c b a a a a
15
127.0.0.1:6379> lrem list2 1 a
1
127.0.0.1:6379> lrange list2 0 -1
a
a
a
b
c
c
b
a
a
b
c
c
b
a
127.0.0.1:6379> lrem list2 3 a
3
127.0.0.1:6379> lrange list2 0 -1
b
c
c
b
a
a
b
c
c
b
a
127.0.0.1:6379> lrem list2 0 a
3
127.0.0.1:6379> lrange list2 0 -1
b
c
c
b
b
c
c
b
127.0.0.1:6379>
2.8 去除指定范围外的元素
ltrim key start stop
127.0.0.1:6379> lpush list3 0 1 2 3 4 5 6 7 8 9
10
127.0.0.1:6379> lrange list3 0 -1
9
8
7
6
5
4
3
2
1
0
127.0.0.1:6379> ltrim list3 0 4
OK
127.0.0.1:6379> lrange list3 0 -1
9
8
7
6
5
127.0.0.1:6379>
2.9 向列表中插入元素
linsert key before|after pivot value
在列表中从左到右查找值为pivot的元素,然后根据BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
127.0.0.1:6379> lpush list4 1 2 4 5
4
127.0.0.1:6379> lrange list4 0 -1
5
4
2
1
127.0.0.1:6379> linsert list4 before 2 3
5
127.0.0.1:6379> lrange list4 0 -1
5
4
3
2
1
127.0.0.1:6379>
2.10 阻塞
blpop key [key ...] timeout
brpop key [key ...] timeout
阻塞情况:
- 如果弹出的列表不存在或者为空,就会阻塞
- 超时时间设置为0,就是永久阻塞,直到有数据可以弹出
- 如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务,即只有1个客户端会接收成功
网友评论