redis | 五、redis之List

97 阅读5分钟

redis系列文章:
liudongdong.top/categories/…
本篇来源:
liudongdong.top/archives/re…
公众号:雨中散步撒哈拉
备注:欢迎关注公众号,一起学习,共同进步!

一、List概述

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

list可以理解为一个通道,可以左边进,也可以右边进。

16293521471.png

根据上边的通道,也可以变体为俩种方式:

  1. 左进右出:队列

  2. 左进左出:桶

二、List分类

根据个人理解和便于学习,个人进行了list命令的分类!
根据命令性质分为:

  1. 增:增加list数据

  2. 删:删除list数据

  3. 改:修改list数据

  4. 查:查询list数据

1. List中的增

  1. lpush:左边推进一个或多个值

  2. lpushx左边推进一个值,列表不存在时,无效

  3. rpush:右边推进一个或多个值

  4. rpushx:右边推进一个值,列表不存在时,无效

  5. linsert:在某一个值的前边或者后边插入一个值

2. List中的删

  1. lrem:移除指定值,重复值根据指定数量进行移除

  2. lpop:头部弹出一个值

  3. rpop:右部弹出一个值

  4. blpop:阻塞弹出头部一个值,如果没有值,则等待有值或超时

  5. brpop:阻塞弹出尾部一个值,如果没有值,则等待有值或超时

  6. rpoplpush:尾部弹出一个值,并把该值压入到新的列表头部

  7. brpoppush:阻塞弹出一个值,并把该值压入到新的列表头部,如果没有值,则等待有值或超时

3. List中的改

  1. lset:根据下标,进行修改值

  2. ltrim:截取列表值(区间范围内,定位值)

4. List中的查

  1. llen:查询列表长度

  2. lindex:根据下标进行获取某一个值

  3. lrange:根据下标范围获取list列表

三、命令实践

根据分类,进行命令操作

1. List中的增

127.0.0.1:6379> keys *
(empty list or set)
# 左边推进俩个值
127.0.0.1:6379> lpush lists one two
(integer) 2
127.0.0.1:6379> lrange lists 0 -1
1) "two"
2) "one"
# 右边推进俩个值
127.0.0.1:6379> rpush lists three four
(integer) 4
127.0.0.1:6379> lrange lists 0 -1
1) "two"
2) "one"
3) "three"
4) "four"
# 左边推进一个值,仅支持一个
127.0.0.1:6379> lpushx lists five
(integer) 5
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "two"
3) "one"
4) "three"
5) "four"
# 右边推进一个值,仅支持一个
127.0.0.1:6379> rpushx lists sex
(integer) 6
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "two"
3) "one"
4) "three"
5) "four"
6) "sex"
# 在某一个值的前边或后边进行插入值
127.0.0.1:6379> linsert lists after three zero
(integer) 7
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "two"
3) "one"
4) "three"
5) "zero"
6) "four"
7) "sex"
127.0.0.1:6379> 

2. List中的删

127.0.0.1:6379> keys *
1) "lists"
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "two"
3) "one"
4) "three"
5) "zero"
6) "four"
7) "sex"
# 头部弹出一个值
127.0.0.1:6379> lpop lists
"five"
127.0.0.1:6379> lrange lists 0 -1
1) "two"
2) "one"
3) "three"
4) "zero"
5) "four"
6) "sex"
# 尾部弹出一个值
127.0.0.1:6379> rpop lists
"sex"
127.0.0.1:6379> lrange lists 0 -1
1) "two"
2) "one"
3) "three"
4) "zero"
5) "four"
# 头部阻塞弹出two值,没有two则取第一个值,如列表没值则返回nil
127.0.0.1:6379> blpop lists two 3
1) "lists"
2) "two"
127.0.0.1:6379> lrange lists 0 -1
1) "one"
2) "three"
3) "zero"
4) "four"
127.0.0.1:6379> blpop lists two 3
1) "lists"
2) "one"
127.0.0.1:6379> lrange lists 0 -1
1) "three"
2) "zero"
3) "four"
# 创建一个新的列表
127.0.0.1:6379> lpush lists2 aa
(integer) 1
# 头部阻塞弹出two值,没有aa则取第一个值,如列表没值则返回nil
127.0.0.1:6379> blpop lists2 aa 3
1) "lists2"
2) "aa"
127.0.0.1:6379> blpop lists2 aa 3
(nil)
(3.10s)
127.0.0.1:6379> lrange lists 0 -1
1) "zero"
2) "four"
127.0.0.1:6379> lrange lists2 0 -1
(empty list or set)
# 尾部弹出,并压入新的列表头部
127.0.0.1:6379> rpoplpush lists lists2
"four"
127.0.0.1:6379> lrange lists 0 -1
1) "zero"
127.0.0.1:6379> lrange lists2 0 -1
1) "four"
# 阻塞,尾部弹出,并压入新的列表头部
127.0.0.1:6379> brpoplpush lists lists2 3
"zero"
127.0.0.1:6379> lrange lists 0 -1
(empty list or set)
127.0.0.1:6379> lrange lists2 0 -1
1) "zero"
2) "four"
127.0.0.1:6379> brpoplpush lists lists2 3
(nil)
(3.04s)
# 移除指定值
127.0.0.1:6379> lrem lists2 1 zero
(integer) 1
127.0.0.1:6379> lrange lists2 0 -1
1) "four"
127.0.0.1:6379> 

3. List中的改

# 创建lists,并赋予值
127.0.0.1:6379> lpush lists one two three four five sex
(integer) 6
127.0.0.1:6379> lrange lists 0 -1
1) "sex"
2) "five"
3) "four"
4) "three"
5) "two"
6) "one"
# 截取list,范围位[1,4]
127.0.0.1:6379> ltrim lists 1 4
OK
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "four"
3) "three"
4) "two"
# 根据下标进行设置值
127.0.0.1:6379> lset lists 0 "hello world"
OK
127.0.0.1:6379> lrange lists 0 -1
1) "hello world"
2) "four"
3) "three"
4) "two"
127.0.0.1:6379>

4. List中的查

127.0.0.1:6379> lrange lists2 0 -1
1) "four"
127.0.0.1:6379> llen lists2
(integer) 1
127.0.0.1:6379> lindex lists2 0
"four"
127.0.0.1:6379> lrange lists2 0 -1
1) "four"
127.0.0.1:6379> 

附录

下表列出了列表相关的基本命令:

序号命令及描述
1[BLPOP key1 key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
2[BRPOP key1 key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
3BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
4LINDEX key index 通过索引获取列表中的元素
5LINSERT key BEFOREAFTER pivot value 在列表的元素前或者后插入元素
6LLEN key 获取列表长度
7LPOP key 移出并获取列表的第一个元素
8[LPUSH key value1 value2] 将一个或多个值插入到列表头部
9LPUSHX key value 将一个值插入到已存在的列表头部
10LRANGE key start stop 获取列表指定范围内的元素
11LREM key count value 移除列表元素
12LSET key index value 通过索引设置列表元素的值
13LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
14RPOP key 移除列表的最后一个元素,返回值为移除的元素。
15RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
16[RPUSH key value1 value2] 在列表中添加一个或多个值
17RPUSHX key value 为已存在的列表添加值