redis中的list是双向链表,能在列表的头部(左边)或者尾部(右边)操作元素.
它不仅可以作为链表使用;
还可以在头部进行压入和弹出操作作为栈使用;
在头部压入和尾部弹出作为队列或者阻塞队列使用;
下面是list相关常用命令
1. 在列表头部插入值
127.0.0.1:6379> lpush key value1
(integer) 1
127.0.0.1:6379> lpush key value2
(integer) 2
127.0.0.1:6379> lpush key value3
(integer) 3
127.0.0.1:6379> lrange key 0 -1
1) "value3"
2) "value2"
3) "value1"
2. 在列表尾部插入值
127.0.0.1:6379> rpush key value-1
(integer) 4
127.0.0.1:6379> rpush key value-2
(integer) 5
127.0.0.1:6379> lrange key 0 -1
1) "value3"
2) "value2"
3) "value1"
4) "value-1"
5) "value-2"
3. 在已存在的列表头部插入值,列表不存在时也不会新建列表
127.0.0.1:6379>
127.0.0.1:6379> lpushx key value4
(integer) 6
127.0.0.1:6379> lpushx key2 value4
(integer) 0
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
127.0.0.1:6379> lrange key2 0 -1
(empty list or set)
4. 在已存在的列表尾部插入值,列表不存在时也不会新建列表
127.0.0.1:6379> rpushx key value-3
(integer) 7
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
7) "value-3"
127.0.0.1:6379> rpushx key2 value-3
(integer) 0
127.0.0.1:6379> lrange key2 0 -1
(empty list or set)
5. 获取列表指定范围内的元素
范围是从头部到尾部尾部选取 遍历方向是从头部到尾部,注意观察例子中几个空值的情况;
-n负数代表列表尾部第n个元素;
eg: -1代表列表尾部第一个元素
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
7) "value-3"
127.0.0.1:6379> lrange key 1 2
1) "value3"
2) "value2"
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
7) "value-3"
从倒数第N个元素开始遍历
127.0.0.1:6379> lrange key -1 2
(empty list or set)
127.0.0.1:6379> lrange key -1 -2
(empty list or set)
127.0.0.1:6379> lrange key -3 2
(empty list or set)
127.0.0.1:6379> lrange key -100 2
1) "value4"
2) "value3"
3) "value2"
127.0.0.1:6379> lrange key -10 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
7) "value-3"
127.0.0.1:6379> lrange key -3 -1
1) "value-1"
2) "value-2"
3) "value-3"
6 .通过索引获取列表中的元素
127.0.0.1:6379> lindex key 1
"value3"
127.0.0.1:6379> lindex key 2
"value2"
127.0.0.1:6379> lindex key 3
"value1"
7. 在列表的元素前或者后插入元素
127.0.0.1:6379> linsert key before value4 before-value4
(integer) 8
127.0.0.1:6379> linsert key after value4 after-value4
(integer) 9
127.0.0.1:6379> lrange key 0 -1
1) "before-value4"
2) "value4"
3) "after-value4"
4) "value3"
5) "value2"
6) "value1"
7) "value-1"
8) "value-2"
9) "value-3"
127.0.0.1:6379>
127.0.0.1:6379> lpushx key value4
(integer) 10
127.0.0.1:6379> linsert key before value4 before-value4
(integer) 11
127.0.0.1:6379> linsert key after value4 after-value4
(integer) 12
127.0.0.1:6379> lrange key 0 -1
1) "before-value4"
2) "value4"
3) "after-value4"
4) "before-value4"
5) "value4"
6) "after-value4"
7) "value3"
8) "value2"
9) "value1"
10) "value-1"
11) "value-2"
12) "value-3"
8. 通过索引设置列表元素的值
127.0.0.1:6379> lset key 0 new-value1
ok
127.0.0.1:6379> lrange key 0 -1
1) "new-value1"
2) "value4"
3) "after-value4"
4) "before-value4"
5) "value4"
6) "after-value4"
7) "value3"
8) "value2"
9) "value1"
10) "value-1"
11) "value-2"
12) "value-3"
127.0.0.1:6379> lset key -1 new-value-1
ok
127.0.0.1:6379> lrange key 0 -1
1) "new-value1"
2) "value4"
3) "after-value4"
4) "before-value4"
5) "value4"
6) "after-value4"
7) "value3"
8) "value2"
9) "value1"
10) "value-1"
11) "value-2"
12) "new-value-1"
9. 获取列表长度,时间复杂度为O(1)
127.0.0.1:6379> llen key
(integer) 12
10. 移出并获取列表的第一个元素
127.0.0.1:6379> lpop key
"new-value1"
127.0.0.1:6379> llen key
(integer) 11
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "after-value4"
3) "before-value4"
4) "value4"
5) "after-value4"
6) "value3"
7) "value2"
8) "value1"
9) "value-1"
10) "value-2"
11) "new-value-1"
11. 移除列表的最后一个元素
127.0.0.1:6379> rpop key
"new-value-1"
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "after-value4"
3) "before-value4"
4) "value4"
5) "after-value4"
6) "value3"
7) "value2"
8) "value1"
9) "value-1"
10) "value-2"
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "after-value4"
3) "before-value4"
4) "value4"
5) "after-value4"
6) "value3"
7) "value2"
8) "value1"
9) "value-1"
10) "value-2"
127.0.0.1:6379> llen key
(integer) 10
12. 移除列表中指定值元素
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为count.
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为count的绝对值.
count = 0 : 移除表中所有与 value 相等的值.
127.0.0.1:6379> lrem key 2 value3
(integer) 1
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "after-value4"
3) "before-value4"
4) "value4"
5) "after-value4"
6) "value2"
7) "value1"
8) "value-1"
9) "value-2"
127.0.0.1:6379> lrem key 0 value4
(integer) 2
127.0.0.1:6379> lrange key 0 -1
1) "after-value4"
2) "before-value4"
3) "after-value4"
4) "value2"
5) "value1"
6) "value-1"
7) "value-2"
127.0.0.1:6379> lrem key -1 value-2
(integer) 1
127.0.0.1:6379> lrange key 0 -1
1) "after-value4"
2) "before-value4"
3) "after-value4"
4) "value2"
5) "value1"
6) "value-1"
13. 删除列表指定区间之外的所有元素
127.0.0.1:6379> ltrim key 2 3
ok
127.0.0.1:6379> lrange key 0 -1
1) "after-value4"
2) "value2"
14. 移除当前列表的最后一个元素,并将该元素添加到另一个列表并返回
127.0.0.1:6379> rpoplpush key key2
"value2"
127.0.0.1:6379> lrange key 0 -1
1) "after-value4"
127.0.0.1:6379> lrange key2 0 -1
1) "value2"
127.0.0.1:6379>
15. 移出并获取列表的第一个元素, 如果列表没有元素会阻塞等待直到等待超时或发现可弹出元素为止。
与blpop类似的brpop,brpoplpush也是带超时时间的阻塞操作.
127.0.0.1:6379> blpop key 10
1) "key"
2) "after-value4"
打开第二个客户端,并插入元素
127.0.0.1:6379> lpush key1 v1
(integer) 1
第一个客户端弹出插入的元素
127.0.0.1:6379> blpop key1 10
1) "key1"
2) "v1"
(3.61s)
127.0.0.1:6379>
当列表中不存在元素时,会等待超时并返回空值
127.0.0.1:6379> blpop key1 10
(nil)
(10.04s)
了解了以上这些命令基本可以搞定你80%的工作了!~