redis数据类型List

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>


小结

  1. list实际上是一个链表,数据可以在链表的左边插入,也可以右边插入,也可以在中间插入
  2. 两边插入时如果链表不存在就会新增链表,如果链表存在就会新增类容
  3. 链表中所有的元素都被移除,也就是空链表,代表该链表也就不存在了
  4. 链表插入或者改动,在两边的效率最高,在中间的话相对要效率低一些

实际应用场景举例

1.消息对列:

实现命令: lpush:左边进   rpop右边出

2.栈:

实现命令: Lpush:左边进  Lpop左边出

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值