redis系列文章: https://liudongdong.top/categories/redis 本篇来源: https://liudongdong.top/archives/rediswu-redis-zhi-list 公众号:雨中散步撒哈拉 备注:欢迎关注公众号,一起学习,共同进步!
一、List概述
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
list可以理解为一个通道,可以左边进,也可以右边进。
16293521471.png
根据上边的通道,也可以变体为俩种方式:
- 左进右出:队列
- 左进左出:桶
二、List分类
根据个人理解和便于学习,个人进行了list命令的分类! 根据命令性质分为:
- 增:增加list数据
- 删:删除list数据
- 改:修改list数据
- 查:查询list数据
1. List中的增
- lpush:左边推进一个或多个值
- lpushx左边推进一个值,列表不存在时,无效
- rpush:右边推进一个或多个值
- rpushx:右边推进一个值,列表不存在时,无效
- linsert:在某一个值的前边或者后边插入一个值
2. List中的删
- lrem:移除指定值,重复值根据指定数量进行移除
- lpop:头部弹出一个值
- rpop:右部弹出一个值
- blpop:阻塞弹出头部一个值,如果没有值,则等待有值或超时
- brpop:阻塞弹出尾部一个值,如果没有值,则等待有值或超时
- rpoplpush:尾部弹出一个值,并把该值压入到新的列表头部
- brpoppush:阻塞弹出一个值,并把该值压入到新的列表头部,如果没有值,则等待有值或超时
3. List中的改
- lset:根据下标,进行修改值
- ltrim:截取列表值(区间范围内,定位值)
4. List中的查
- llen:查询列表长度
- lindex:根据下标进行获取某一个值
- lrange:根据下标范围获取list列表
三、命令实践
根据分类,进行命令操作
1. List中的增
代码语言:javascript复制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中的删
代码语言:javascript复制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中的改
代码语言:javascript复制# 创建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中的查
代码语言:javascript复制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 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
3 | BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
4 | LINDEX key index 通过索引获取列表中的元素 |
5 | LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素 |
6 | LLEN key 获取列表长度 |
7 | LPOP key 移出并获取列表的第一个元素 |
8 | [LPUSH key value1 value2] 将一个或多个值插入到列表头部 |
9 | LPUSHX key value 将一个值插入到已存在的列表头部 |
10 | LRANGE key start stop 获取列表指定范围内的元素 |
11 | LREM key count value 移除列表元素 |
12 | LSET key index value 通过索引设置列表元素的值 |
13 | LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
14 | RPOP key 移除列表的最后一个元素,返回值为移除的元素。 |
15 | RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
16 | [RPUSH key value1 value2] 在列表中添加一个或多个值 |
17 | RPUSHX key value 为已存在的列表添加值 |