列表(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中文网: