List
数据结构类似java的Map<String,List<String>>
{
"key":[1,2,3,4,5,6]
}
在redis中,list可以做栈,队列,阻塞队列(当队列空的时候,获取数据的线程将会阻塞,当队列满的时候,往队列里面新增数据的线程将会阻塞)
常用命令介绍
所有的list命令大多数都是以L开头的,redis不区分大小写命令
1. LPUSH key value1 value2 ....
插入一个值或者多个值,每次都从列表的最左边插入
如果插入多个时: value1插入最左边,value2又会插入到value1的最左边
返回结果: 返回列表的长度
2. LRANGE key start end
获取队列指定位置间值,start代表开始下标,end代表结束下标 注意:0为从左到右第一个索引,-1代表为从右到左的第一个索引
返回结果: 下标范围内所有的值
3. rpush key value1 value2 ....
插入一个值或者多个值,每次都从列表的最右边插入,
如果插入多个时: value1插入最右边,value2又会插入到value1的最右边
返回结果: 返回列表的长度
4. Lpop key
移除列表最左边的第一个元素
返回结果:
a.移除的值
b.如果列表为空或者不存在就会返回nil
5. Rpop key
移除列表最右边的第一个元素
返回结果:
a.移除的值
b.如果列表为空或者不存在就会返回nil
6. lpop key count 与 rpop key count
移除列表最左边的元素,count代表移除几个元素,同理rpop key count也是这样的,只不过是从最右边开始移除
返回结果:
a.移除的值
b.如果列表为空或者不存在就会返回nil
7. Lindex key index
获取index索引上的值,注意:0为从左到右第一个索引,-1代表为从右到左的第一个索引
返回结果:
a.索引上的值
b.如果列表为空或者不存在或者索引超出了列表的长度,就会返回nil
8. Llen key
获取队列的长度
返回结果:
a.列表的长度
b.如果列表为空或者不存在,就会返回0
9. LREM key count value
移除列表中指定的值,count代表移除几个如果count为0代表全部移除,value代表要移除的值
返回结果:
a.移除的数量
b.如果列表为空或者不存在,就会返回0
10. ltrim key start end
截取key指定索引范围的数据,其他的数据将会被删除,只保留指定索引范围内的数据
返回结果: ok(即使列表不存在或者索引超出了列表的长度都是返回ok)
11. rpopLpush key1 key2
将key1最右边的元素插入到key2最左边,如果key2不存在将会被创建
返回结果:
a.操作的元素值
b.如果key1不存在,就返回nil
12. exists key
判断key是否存在
返回结果: 存在就返回1,不存在就返回0
13. lset key index value
设定列表指定下标的值,不是新增是修改,如果列表不存在,会报错,如果下标超出了列表也会报错
返回结果:
a.ok;
b.如果列表不存在,会报错;
c.如果下标超出了列表也会报错
14. linsert key before|after value1 value2
将value2元素插入的列表key中元素value1元素的before|after(前面或者后面)
返回结果:
a.成功就返回列表的长度
b.如果列表不存在就返回0
c.如果列表不存在value1就返回-1
d.如果列表存在多个value1,只会从左到右找到第一个匹配的元素并将value2插入到其的前面或者后面,并返回列表长度
localhost:6500> keys *
(empty array)
localhost:6500> LPUSH list 1 2 3 //1.插入一个值或者多个值,每次都从列表的最左边插入
(integer) 3
localhost:6500> LRANGE list 0 -1 //2.获取队列指定位置的值,0为从左到右第一个索引,-1代表为从右到左的第一个索引
1) "3"
2) "2"
3) "1"
localhost:6500> rpush list2 1 //3.插入以个值或者多个值,每次都从列表的最右边插入
(integer) 1
localhost:6500> rpush list2 2
(integer) 2
localhost:6500> rpush list2 3
(integer) 3
localhost:6500> LRANGE list2 0 -1
1) "1"
2) "2"
3) "3"
localhost:6500> Lpop list2 //4.移除列表最左边的第一个元素
"1"
localhost:6500> Rpop list2 //5.移除列表最右边的第一个元素
"3"
localhost:6500> Lrange list2 0 -1
1) "2"
localhost:6500> lrange list3 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
localhost:6500> lpop list3 2 //6.如果Lpop移除命令后面跟上数字,代表从最左边开始移除几个,2就代表移除2个,rpop同理
1) "0"
2) "1"
localhost:6500> lrange list3 0 -1
1) "2"
2) "3"
localhost:6500> Lindex list3 0 //7.获取下标上的值,下标从0开始
"2"
localhost:6500> Llen list3 //8.获取队列的长度
(integer) 2
localhost:6500> lrange list1 0 -1
1) "1"
2) "1"
3) "2"
4) "3"
localhost:6500> lrem list1 2 1 //9.移除指定的值 LREM key count value; count代表移除几个如果count为0代表全部移除,value代表要移除的值
(integer) 2
localhost:6500> lrange list1 0 -1
1) "2"
2) "3"
localhost:6500> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
localhost:6500> ltrim list1 1 2 //10.ltrim key start end;截取key指定下标的数据,其他的数据将会被删除,只保留指定下标范围内的数据
OK
localhost:6500> lrange list1 0 -1
1) "2"
2) "3"
localhost:6500> rpopLpush list1 list2 //11.rpopLpush key1 key2;将key1最右边的元素插入到key2最左边,如果key2不存在将会被创建
"3"
localhost:6500> lrange list1 0 -1
1) "2"
localhost:6500> lrange list2 0 -1
1) "3"
localhost:6500> keys *
1) "list2"
2) "list1"
localhost:6500> exists list1 //12.exists key; 判断key是否存在
(integer) 1
localhost:6500> exists list5
(integer) 0
/
localhost:6500> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
localhost:6500> lset mylist 0 zhangshan //13.设定列表指定下标的值,不是新增是修改,如果列表不存在,会报错,如果下标超出了列表也会报错
OK
localhost:6500> lrange mylist 0 -1
1) "zhangshan"
2) "2"
3) "3"
4) "4"
5) "5"
localhost:6500> linsert mylist before zhangshan lishi //14.将一个元素插入到一个列表中其中一个元素的前面或者后面, befor|after代表前面或者后面 zhangshan代表列表中的元素 lishi代表要插入的元素
(integer) 6
localhost:6500> lrange mylist 0 -1
1) "lishi"
2) "zhangshan"
3) "2"
4) "3"
5) "4"
6) "5"
localhost:6500> linsert mylist after lishi wangwu
(integer) 7
localhost:6500> lrange mylist 0 -1
1) "lishi"
2) "wangwu"
3) "zhangshan"
4) "2"
5) "3"
6) "4"
7) "5"
localhost:6500>
小结
- list实际上是一个链表,数据可以在链表的左边插入,也可以右边插入,也可以在中间插入
- 两边插入时如果链表不存在就会新增链表,如果链表存在就会新增类容
- 链表中所有的元素都被移除,也就是空链表,代表该链表也就不存在了
- 链表插入或者改动,在两边的效率最高,在中间的话相对要效率低一些
实际应用场景举例
1.消息对列:
实现命令: lpush:左边进 rpop右边出
2.栈:
实现命令: Lpush:左边进 Lpop左边出