有道无术,术尚可求,有术无道,止于术。
本系列Redis 版本 7.2.5
源码地址:https://gitee.com/pearl-organization/study-redis-demo
文章目录
- 1. 概述
- 2. 常用命令
- 2.1 RPUSH
- 2.2 LPUSH
- 2.3 LRANGE
- 2.4 LINDEX
- 2.6 LREM
- 2.7 LLEN
- 2.8 LPOP
- 2.9 RPOP
- 2.10 LSET
- 3. 应用场景
1. 概述
Redis List
(列表)是一种基于双向链表的数据结构,允许包含重复的元素,支持在列表的头部和尾部添加或删除元素。
2. 常用命令
List
相关的所有命令:
命名 | 描述 |
---|---|
LMOVE | 删除源列表的第一个或最后一个元素,并移入到目标列表中的第一个或最后一个位置 |
LMPOP | 弹出一个或多个元素 |
BLMOVE | LMOVE 的阻塞变体 |
BLMPOP | LMPOP 的阻塞变体 |
BLPOP | 移出并获取列表的第一个元素 |
BRPOP | 移出并获取列表的最后一个元素 |
BRPOPLPUSH | 从列表中弹出一个值,并将该值插入到另外一个列表中并返回它 |
LINDEX | 通过索引获取列表中的元素 |
LINSERT | 在列表的元素前或者后插入元素 |
LLEN | 获取列表长度 |
LPOP | 移出并获取列表的第一个元素 |
LPOS | 返回列表中匹配元素的索引 |
LPUSH | 将一个或多个值插入到列表头部 |
LPUSHX | 将一个值插入到已存在的列表头部 |
LRANGE | 获取列表指定范围内的元素 |
LREM | 移除列表元素 |
LSET | 通过索引设置列表元素的值 |
LTRIM | 对一个列表进行修剪 |
RPOP | 移除并获取列表最后一个元素 |
RPOPLPUSH | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
RPUSH | 在列表中添加一个或多个值 |
RPUSHX | 为已存在的列表添加值 |
2.1 RPUSH
RPUSH
向存存储在 key
中的列表的尾部插入所有指定的值(多个时依次从左到右按序从列表尾部插入)。如果 key
不存在,那么会创建一个空的列表然后再进行 push
操作。 返回值为执行操作后的列表长度,当 key
保存的不是列表,那么会返回一个错误。
基本语法:
RPUSH key element [element ...]
示例:
redis> RPUSH mylist "hello"
(integer) 1
redis> RPUSH mylist "world"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
2.2 LPUSH
LPUSH
用于将一个或多个值插入到列表的头部,返回值为执行操作后列表的长度。
注意事项:
- 如果
key
不存在,那么在进行push
操作前会创建一个空列表。 - 如果
key
对应的值不是List
类型,那么会返回一个错误。 - 可以使用一个命令把多个元素
push
进入列表,只需在命令末尾加上多个指定的参数。元素按在参数中出现的顺序,从左到右依次插入到 list 的头部。
基本语法:
LPUSH key element [element ...]
示例:
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
2.3 LRANGE
LRANGE
用于返回列表中指定区间内的元素,区间以偏移量 START
和 END
指定。 其中 0
表示列表的第一个元素, 1
表示列表的第二个元素,以此类推。以 -1
表示列表的最后一个元素, -2
表示列表的倒数第二个元素,以此类推。
基本语法:
LRANGE key start stop
注意事项:
stop
下标也在LRANG
E 命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,例如执行LRANGE list 0 10
,结果是一个包含11
个元素的列表- 超出范围的下标值不会引起错误,例如
start
下标比列表的最大下标还要大时,那么会返回一个空列表。
示例:
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> LRANGE mylist 0 0
1) "one"
redis> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist 5 10
(empty list or set)
2.4 LINDEX
LINDEX
返回列表 key
里索引 index
位置存储的元素。 index
下标是从 0
开始索引的,所以 ``0 是表示第一个元素, 1
表示第二个元素,并以此类推。 负数索引用于指定从列表尾部开始索引的元素,在这种方法下,-1
表示最后一个元素,-2
表示倒数第二个元素,并以此往前推。当index
超出索引范围时返回 nil
。
基本语法:
LINDEX key index
示例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3
(nil)
2.6 LREM
LREM
用于从列表 key
中删除前 count
个值等于 element
的元素,返回值为删除元素个数。这个 count
参数通过下面几种方式影响这个操作:
count > 0
: 从头到尾删除值为value
的元素。count < 0
:从尾到头删除值为value
的元素。count = 0
:移除所有值为value
的元素。
例如, LREM list -2 “hello”
会从列表中删除最后两个出现的 “hello”
。
基本语法:
LREM key count element
示例:
redis> RPUSH mylist "hello"
(integer) 1
redis> RPUSH mylist "hello"
(integer) 2
redis> RPUSH mylist "foo"
(integer) 3
redis> RPUSH mylist "hello"
(integer) 4
redis> LREM mylist -2 "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "foo"
2.7 LLEN
LLEN
用于返回存储在 key
中的列表长度。 如果 key
不存在,则 key
被解释为一个空列表,返回 0
。 如果 key
不是列表类型,返回一个错误。
基本语法:
LLEN key
示例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LPUSH mylist "Redis.com.cns"
(integer) 3
redis> LLEN mylist
(integer) 3
2.8 LPOP
LPOP
命令用于删除并返回存储在 key
中的列表的第一个元素。返回值为列表的首元素,key
不存在的时候返回 nil
。
基本语法:
LPOP key
示例:
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> LPOP mylist
"one"
redis> LRANGE mylist 0 -1
1) "two"
2) "three"
2.9 RPOP
RPOP
用于移除并返回列表 key
的最后一个元素。返回值为最后一个元素的值,key
不存在时返回 nil
。
基本语法:
RPOP key
示例:
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> RPOP mylist
"three"
redis> LRANGE mylist 0 -1
1) "one"
2) "two"
2.10 LSET
LSET
用于设置列表 key
中 index
位置的元素值,当 index
超出列表索引范围时会返回错误 ERR ERR index out of range
。
基本语法:
LSET key index element
示例:
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> LSET mylist 0 "four"
"OK"
redis> LSET mylist -2 "five"
"OK"
redis> LRANGE mylist 0 -1
1) "four"
2) "five"
3) "three"
3. 应用场景
Redis List
提供了高效的列表结构操作,可以方便地进行数据的插入、删除和访问。
主要优点如下:
- 快速的元素插入和删除:可以在列表的头部或尾部进行操作,时间复杂度为
O(1)
。 - 可以作为队列或栈使用:支持
LPUSH
和LPOP
操作创建栈,支持RPUSH
和BRPOP
操作创建队列。 - 提供了块操作:可以一次性获取或删除多个元素,减少了网络往返时间。
- 可以作为数据缓存:因为
Redis
是内存中的数据结构,可以作为高速缓存使用。
应用场景:
- 数据缓存:通过推入或者弹出元素进行列表操作,并且可以实现分页查询。
- 消息队列:生产者将消息推入列表,消费者从列表中拉取消息。
- 简单排行榜:通过使用
SORT
命令可以根据分数来排序