【从0到1进阶Redis】List 列表

列表(list):按照插入顺序排列的字符串元素的集合。从根本上说它们是 Linked Lists链表。可以存放重复元素!
在Redis中,我们把list可以玩成栈、队列、阻塞队列


  • 当只有一个出入口时,看似一个桶,先进去的只能后出来,遵循后进先出原则。
    在这里插入图片描述
  • 消息队列
    左边添加,右边取出
    在这里插入图片描述
  • 阻塞队列
    两边可以同时取
    在这里插入图片描述

1、List命令

Redis命令不区分大小写!
一些基本命令String类型的基本命令我在前面已经讲过,大家不清楚的可以去看一下。在这里插入图片描述

老样子!先把客户端启动
在这里插入图片描述

`LPUSH`  命令向list的左边(List头部)添加一个新元素
`RPUSH`  命令向list的右边(List尾部)添加一个新元素
`LRANGE` 命令从list中提取一定范围的元素
127.0.0.1:6379> lpush myList one 	# 将一个值插入到列表头部(左)
(integer) 1
127.0.0.1:6379> lpush myList two	
(integer) 2
127.0.0.1:6379> lpush myList three
(integer) 3
127.0.0.1:6379> lrange myList 0 -1	# [0,-1]获取所有元素	
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange myList 0 1	# 通过区间获取指定范围元素
1) "three"
2) "two"
127.0.0.1:6379> lpush myList one aa bb	# 将多个值插入到列表头部(左),list中值可以重复!!!
(integer) 6
127.0.0.1:6379> lrange myList 0 -1
1) "bb"
2) "aa"
3) "one"
4) "three"
5) "two"
6) "one"
127.0.0.1:6379> rpush myList right		# 将一个值插入到列表尾部(右)
(integer) 7
127.0.0.1:6379> lrange myList 0 -1
1) "bb"
2) "aa"
3) "one"
4) "three"
5) "two"
6) "one"
7) "right"

----------------------------------------------------------------------------------------------------
`LPOP`	移出并获取列表的第一个元素
`RPOP`	移除并获取列表最后一个元素

127.0.0.1:6379> lrange myList 0 -1
1) "bb"
2) "aa"
3) "one"
4) "three"
5) "two"
6) "one"
7) "right"
127.0.0.1:6379> lpop myList 	# 移出并获取列表的第一个元素
"bb"
127.0.0.1:6379> rpop myList		# 移除并获取列表最后一个元素
"right"
127.0.0.1:6379> lrange myList 0 -1
1) "aa"
2) "one"
3) "three"
4) "two"
5) "one"

----------------------------------------------------------------------------------------------------
`LINDEX`  通过索引获取列表中的元素

127.0.0.1:6379> lrange myList 0 -1
1) "aa"
2) "one"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> lindex myList 2
"three"
127.0.0.1:6379> lindex myList 6
(nil)
127.0.0.1:6379> lindex myList 1
"one"

----------------------------------------------------------------------------------------------------
`LLEN`	获取列表长度

127.0.0.1:6379> lrange myList 0 -1
1) "aa"
2) "one"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> llen myList
(integer) 5

----------------------------------------------------------------------------------------------------
`LREM`	移除list中指定个数的value,精确匹配

127.0.0.1:6379> lrange myList 0 -1
1) "one"
2) "aa"
3) "aa"
4) "three"
5) "two"
6) "one"
127.0.0.1:6379> lrem myList 1 one
(integer) 1		# 返回移除的个数
127.0.0.1:6379> lrem myList 2 aa
(integer) 2
127.0.0.1:6379> lrem myList 8 six	# list中没有的元素返回0
(integer) 0
127.0.0.1:6379> lrange myList 0 -1
1) "three"
2) "two"
3) "one"

----------------------------------------------------------------------------------------------------
`LTRIM`	 对一个列表进行修剪(trim)!截取!

127.0.0.1:6379> lrange myList 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> ltrim myList 1 3	# 通过区间下标截取指定的长度,list已经被改变,截取只剩下的元素!
OK
127.0.0.1:6379> lrange myList 0 -1
1) "v4"
2) "v3"
3) "v2"

----------------------------------------------------------------------------------------------------
`RPOPLPUSH`	移除列表的最后一个元素,并将该元素添加到另一个列表并返回

127.0.0.1:6379> flushdb		# flushdb清除当前数据库,flushall为清除所有数据库
OK
127.0.0.1:6379> lpush mylist k1 k2 k3	# 在list中添加多个值
(integer) 3
127.0.0.1:6379> keys *	# 查看所有的key
1) "mylist"
127.0.0.1:6379> lrange mylist 0 -1		# 查看list中所有的元素
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> rpoplpush mylist youlist	# 移除列表的最后一个元素(尾部),添加到新的列表中
"k1"
127.0.0.1:6379> keys *
1) "mylist"
2) "youlist"
127.0.0.1:6379> lrange mylist 0 -1	# 查看原来列表中所有的元素
1) "k3"
2) "k2"
127.0.0.1:6379> lrange youlist 0 -1	 # 查看目标列表中所有的元素
1) "k1"

----------------------------------------------------------------------------------------------------
`LSET`	将列表中指定下标的值替换为另外一只值,更新操作!

127.0.0.1:6379> keys *	# 查看所有的key
1) "mylist"
2) "youlist"
127.0.0.1:6379> exists mylist	# 判断当前列表是否存在, 存在返回1, 否则返回0
(integer) 1
127.0.0.1:6379> exists myohterlist
(integer) 0
127.0.0.1:6379> lrange youlist 0 -1	# 查看列表所有元素
1) "k1"
127.0.0.1:6379> lset youlist 0 newValue	# 将列表中指定下标0的值替换为newValue,如果存在,更新当前下标的值!!
OK
127.0.0.1:6379> lrange youlist 0 -1	# 查看更新后列表所有元素
1) "newValue"
127.0.0.1:6379> lset youlist 2 item 	# 如果不存在,则报错!!
(error) ERR index out of range
127.0.0.1:6379> lset ohterList 0 v1	 # 更新一个不存在的列表也会报错!!
(error) ERR no such key

----------------------------------------------------------------------------------------------------
`LINSERT`	在列表的元素前或者后插入元素,将某个具体的value插入到列表中某个具体元素的前后或后面!

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush list hi boy
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "hi"
2) "boy"
127.0.0.1:6379> linsert list after hi shy	# 在列表的hi元素的后面插入shy值
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hi"
2) "shy"
3) "boy"
127.0.0.1:6379> linsert list before shy the	# 在列表的shy元素的前面插入the值
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "hi"
2) "the"
3) "shy"
4) "boy"

2、总结!

  • list实际是一个链表
  • 如果key不存在,创建新的链表
  • 如果key存在,新增元素
  • 如果移除了所有元素,空链表,也代表不存在
  • 在两边插入值或改动值,效率最高!中间元素,效率相对会低一点
    list可以实现我们的消息排队!消息队列(lpush rpop),栈(lpush lpop)

图片来自redis中文网:
在这里插入图片描述

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我OldFe

一分也是鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值