当前位置:   article > 正文

Redis 7.x 系列【7】数据类型之列表(List)

Redis 7.x 系列【7】数据类型之列表(List)

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

1. 概述

Redis List(列表)是一种基于双向链表的数据结构,允许包含重复的元素,支持在列表的头部和尾部添加或删除元素。
在这里插入图片描述

2. 常用命令

List 相关的所有命令:

命名描述
LMOVE删除源列表的第一个或最后一个元素,并移入到目标列表中的第一个或最后一个位置
LMPOP弹出一个或多个元素
BLMOVELMOVE的阻塞变体
BLMPOPLMPOP的阻塞变体
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 ...]
  • 1

示例:

redis> RPUSH mylist "hello"
(integer) 1
redis> RPUSH mylist "world"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.2 LPUSH

LPUSH 用于将一个或多个值插入到列表的头部,返回值为执行操作后列表的长度。

注意事项:

  • 如果 key 不存在,那么在进行 push 操作前会创建一个空列表。
  • 如果 key 对应的值不是 List 类型,那么会返回一个错误。
  • 可以使用一个命令把多个元素 push 进入列表,只需在命令末尾加上多个指定的参数。元素按在参数中出现的顺序,从左到右依次插入到 list 的头部。

基本语法:

LPUSH key element [element ...]
  • 1

示例:

redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.3 LRANGE

LRANGE用于返回列表中指定区间内的元素,区间以偏移量 STARTEND 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

基本语法:

LRANGE key start stop
  • 1

注意事项:

  • stop 下标也在 LRANGE 命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,例如执行 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.4 LINDEX

LINDEX 返回列表 key 里索引 index 位置存储的元素。 index 下标是从 0 开始索引的,所以 ``0 是表示第一个元素, 1 表示第二个元素,并以此类推。 负数索引用于指定从列表尾部开始索引的元素,在这种方法下,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推。当index 超出索引范围时返回 nil

基本语法:

LINDEX key index
  • 1

示例:

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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
  • 1

示例:

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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.7 LLEN

LLEN 用于返回存储在 key 中的列表长度。 如果 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。

基本语法:

LLEN key
  • 1

示例:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.8 LPOP

LPOP 命令用于删除并返回存储在 key 中的列表的第一个元素。返回值为列表的首元素,key 不存在的时候返回 nil

基本语法:

LPOP key
  • 1

示例:

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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.9 RPOP

RPOP 用于移除并返回列表 key 的最后一个元素。返回值为最后一个元素的值,key 不存在时返回 nil

基本语法:

RPOP key
  • 1

示例:

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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.10 LSET

LSET 用于设置列表 keyindex 位置的元素值,当 index 超出列表索引范围时会返回错误 ERR ERR index out of range

基本语法:

LSET key index element
  • 1

示例:

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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

3. 应用场景

Redis List 提供了高效的列表结构操作,可以方便地进行数据的插入、删除和访问。

主要优点如下:

  • 快速的元素插入和删除:可以在列表的头部或尾部进行操作,时间复杂度为 O(1)
  • 可以作为队列或栈使用:支持 LPUSHLPOP 操作创建栈,支持 RPUSHBRPOP 操作创建队列。
  • 提供了块操作:可以一次性获取或删除多个元素,减少了网络往返时间。
  • 可以作为数据缓存:因为 Redis 是内存中的数据结构,可以作为高速缓存使用。

应用场景:

  • 数据缓存:通过推入或者弹出元素进行列表操作,并且可以实现分页查询。
  • 消息队列:生产者将消息推入列表,消费者从列表中拉取消息。
  • 简单排行榜:通过使用 SORT 命令可以根据分数来排序
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/784546
推荐阅读
相关标签
  

闽ICP备14008679号