1 list类型介绍
- 存储多个数据,并对数据进入存储空间的顺序进行区分
- 一个存储空间保存多个数据,且通过数据可以体现进入顺序
- 保存多个数据,底层使用双向链表存储结构实现
2 操作指令
2.1 基本操作(增删改插)
- 添加
lpush key value1 [value2] …… # 将某个值从左push到list
lpushx key value # 同lpush,但是必须要保证这个key存在
rpush key value1 [value2] …… # 将某个值从右边push到list
rpushx key value …… # 同rpush,但是必须要保证这个key存在
linsert key BEFORE|AFTER pivot value # 在某一个元素之前,之后插入新元素
- 获取数据
lrange key start stop # 获取某一个下标区间内的元素 索引下标可以是负数,比如-1,就表示倒数第一个
lindex key index # 获取某一个指定索引位置的元素
llen key # 获取列表元素个数
- 获取并移除数据
lpop key # 返回和移除列表左边的第一个元素
rpop key # 返回和移除列表右边的第一个元素
- 修改数据
lset key index value # 设置某一个指定索引的值(索引必须存在),索引计数是从左边开始的
- 删除指定元素,并且可以指定个数,即使count为0也会删除一个(至少会删除一个指定的元素)
lrem key count value
- ltrim:保留列表中特定区间内的元素(依然是左边开始数),索引计数是从左边开始的
ltrim key start stop
eg1:
localhost:6379> lpush score 1 2 3
(integer) 3
localhost:6379> llen score
(integer) 3
localhost:6379> lrange score 0 2 # 一定要注意取出来的顺序,很好理解,第一个从左push进去的1,然后是2,3;所以最后最左边的元素就是3,依次为3,2,1
1) "3"
2) "2"
3) "1"
localhost:6379> lpop score # 从左边出来来的就是3
"3"
localhost:6379> rpop score # 从左边出来来的就是1
"1"
一定要注意取出来的顺序,很好理解,第一个从左push进去的1,然后是2,3;所以最后最左边的元素就是3,依次为3,2,1
eg2:
localhost:6379> rpush users kobe wade harden
(integer) 3
localhost:6379> lrange users 0 2
1) "kobe"
2) "wade"
3) "harden"
localhost:6379> lrange 0 -1
(error) ERR wrong number of arguments for 'lrange' command
localhost:6379> lrange users 0 -1
1) "kobe"
2) "wade"
3) "harden"
localhost:6379> lrange users 0 -2
1) "kobe"
2) "wade
从右边依次push进去kobe wade harden,所以你从左边看,顺序依然是kobe wade harden
eg3: 测试linsert
localhost:6379> lpush ids 1 2 3 5
(integer) 4
localhost:6379> lrange ids 0 -1
1) "5"
2) "3"
3) "2"
4) "1"
localhost:6379> linsert ids before 1 a # 1这个元素之前插入一个a
(integer) 5
localhost:6379> lrange ids 0 -1 # 遍历看一下
1) "5"
2) "3"
3) "2"
4) "a"
5) "1"
localhost:6379> linsert ids before 6 a # 6这个元素不存在返回-1
(integer) -1
localhost:6379> linsert ids after 1 b
(integer) 6
localhost:6379> lrange ids 0 -1 # 遍历
1) "5"
2) "3"
3) "2"
4) "a"
5) "1"
6) "b"
eg4:测试lset
localhost:6379> lpush users kobe wade harden
(integer) 3
localhost:6379> lset users 0 rose
OK
localhost:6379> lrange users 0 -1
1) "rose"
2) "wade"
3) "kobe"
- 0索引的元素并非是第一个push进去的,而是最后一个推进去的,因为索引计数是从左边开始的
- 此时列表:[harden, wade, kobe]
- 左边的第0个就是harden
localhost:6379> rpush users kobe wade harden
(integer) 3
localhost:6379> lset users 0 rose
OK
localhost:6379> lrange users 0 -1
1) "rose"
2) "wade"
3) "harden"
- 此时列表:[kobe, wade, harden]
- 左边的第0个就是kobe
eg5:测试lrem
localhost:6379> lpush users kobe wade harden kobe james
(integer) 5
localhost:6379> lrange users 0 -1
1) "james"
2) "kobe"
3) "harden"
4) "wade"
5) "kobe"
localhost:6379> lrem users 1 kobe
(integer) 1
localhost:6379> lrange users 0 -1
1) "james"
2) "harden"
3) "wade"
4) "kobe"
2.2 阻塞式获取
blpop key1 [key2] timeout
brpop key1 [key2] timeout
3 常用客户端指令总结
命令 | 说明 |
---|---|
lpush | 将某个值加入到一个key列表头部 |
lpushx | 同lpush,但是必须要保证这个key存在 |
rpush | 将某个值加入到一个key列表末尾 |
rpushx | 同rpush,但是必须要保证这个key存在 |
lpop | 返回和移除列表左边的第一个元素 |
rpop | 返回和移除列表右边的第一个元素 |
lrange | 获取某一个下标区间内的元素 |
llen | 获取列表元素个数 |
lset | 设置某一个指定索引的值(索引必须存在) |
lindex | 获取某一个指定索引位置的元素 |
lrem | 删除重复元素 |
ltrim | 保留列表中特定区间内的元素 |
linsert | 在某一个元素之前,之后插入新元素 |
4 list 类型数据操作注意事项
- list中保存的数据都是string类型的,数据总容量是有限的,最多2^32- 1 个元素 (4294967295)。
- list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作