前言
在 redis 中,list 是一种非常常见的数据类型,用于表示一个有序的字符串集合。与传统的链表结构类似,redis 的 list 支持在两端进行高效的插入和删除操作,因此非常适合实现队列(queue)和栈(stack)等数据结构。
redis list 的基本概念
- 有序的字符串集合:list中的元素按插入顺序排列,每个元素都是一个字符串。
- 双端队列:redis list 是一个双端队列(deque),允许你在列表的两端高效地进行操作(插入和删除)。
- 最大长度:redis 的 list 数据类型没有最大长度限制,理论上可以存储无限多的元素,除非内存不足。
list命令:
lpush
lpush
命令用于将一个或多个元素插入到列表的头部(即左侧)。如果列表不存在,redis 会自动创建一个空列表并执行插入操作。语法: lpush key value [value ...]
127.0.0.1:6379> lpush key 1 2 3 4 (integer) 4 127.0.0.1:6379> lrange key 0 -1 1) "4" 2) "3" 3) "2" 4) "1"返回值
- 返回插入元素后的列表长度。
lpushx
lpushx
是一个用于将元素推入到列表(list)头部的命令,但与lpush
不同的是,lpushx
只有在列表已存在的情况下才会执行操作。如果列表不存在,lpushx
不会做任何操作,也不会创建新的列表。语法:lpushx key value
127.0.0.1:6379> lpush key world (integer) 1 127.0.0.1:6379> lpushx key hello (integer) 2 127.0.0.1:6379> lpushx key2 hi (integer) 0 127.0.0.1:6379> lrange key 0 -1 1) "hello" 2) "world" 127.0.0.1:6379> lrange key2 0 -1 (empty array)总结:
lpushx
用于将元素添加到已经存在的列表中,它不会创建新的列表,这与lpush
(无论列表是否存在都创建新列表)有所不同。
rpush
r
p
ush
命令用于将一个或多个元素插入到列表的尾部(即右侧)。如果列表不存在,redis 会自动创建一个空列表并执行插入操作。语法:rpush key value [value ...]
127.0.0.1:6379> rpush key 1 2 3 4 (integer) 4 127.0.0.1:6379> rpush key 5 6 7 8 (integer) 8 127.0.0.1:6379> lrange key 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8"返回值:
- 返回插入元素后的列表长度。
rpushx 同理 lpushx
lrange
lrange
命令用于获取列表中的一个指定范围的元素。你可以指定开始和结束的索引位置,然后 redis 会返回该范围内的所有元素。语法:lrange key start stop
127.0.0.1:6379> lrange key 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 127.0.0.1:6379> lrange key 0 3 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> lrange key 0 100 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 127.0.0.1:6379> lrange key 8 10 (empty array) 127.0.0.1:6379> lrange key -8 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8"返回值:
- 返回指定范围内的所有元素。如果范围超出列表长度,redis 会返回所有符合范围条件的元素。
总结:
lrange
用于获取 redis 列表中指定范围的元素。- 支持负数索引,可以从列表尾部获取元素。
- 如果
start
和stop
超出了列表的实际长度,redis 会自动调整范围。
lpop
lpop
命令用于从列表的头部(左侧)移除并返回一个元素。执行该命令时,列表的第一个元素会被移除,并返回这个被移除的元素。如果列表为空,lpop
会返回nil
。语法:lpop key
127.0.0.1:6379> rpush key 1 2 3 4 (integer) 4 127.0.0.1:6379> lpop key "1" 127.0.0.1:6379> lpop key "2" 127.0.0.1:6379> lpop key "3" 127.0.0.1:6379> lpop key "4" 127.0.0.1:6379> lpop key (nil)返回值:
- 返回被移除的列表元素。
- 如果列表为空,返回
nil
。总结:
lpop
是一个用于从 redis 列表左侧移除并返回一个元素的命令。如果列表为空,返回nil
。
rpop 同理
rpop
命令用于从列表的尾部(右侧)移除并返回一个元素。执行该命令时,列表的最后一个元素会被移除,并返回该元素。如果列表为空,rpop
会返回 nil
。
lindex
lindex
命令用于获取列表中指定位置的元素。你可以通过指定一个索引来获取列表中对应位置的元素。语法:lindex key index
127.0.0.1:6379> rpush key 1 2 3 4 5 6 7 8 (integer) 8 127.0.0.1:6379> lindex key 0 "1" 127.0.0.1:6379> lindex key 7 "8" 127.0.0.1:6379> lindex -1 127.0.0.1:6379> lindex key -1 "8" 127.0.0.1:6379> lindex key -7 "2" 127.0.0.1:6379> lindex key 9 (nil)返回值:
返回指定位置的元素。
如果指定的索引超出了列表的范围,返回
nil
。总结:
lindex
用于获取 redis 列表中指定位置的元素。可以通过正数索引或负数索引来指定位置。如果索引超出范围,返回nil
。这是一个读取操作,而不会改变列表内容
linsert
linsert
命令用于在列表中指定位置插入一个元素。你可以在列表的 左侧 或 右侧 插入元素,依据你指定的插入位置。语法:linsert key before|after pivot element127.0.0.1:6379> rpush key a b c d (integer) 4 127.0.0.1:6379> linsert key before b 111 (integer) 5 127.0.0.1:6379> linsert key after b 222 (integer) 6 27.0.0.1:6379> linsert key before e 333 (integer) -1 127.0.0.1:6379> lrange key 0 -1 1) "a" 2) "111" 3) "b" 4) "222" 5) "c" 6) "d"返回值:
如果操作成功,返回列表的新长度。
如果
pivot
元素在列表中不存在,则不插入任何元素,返回-1
。总结:
linsert
命令在 redis 列表中指定位置插入一个新元素。可以在指定元素的 前 或 后 插入。它是一个修改列表的命令,成功执行后返回新的列表长度,如果指定的pivot
元素不存在,则返回-1
。
llen
llen
命令用于获取列表的长度,即列表中元素的数量。语法:llen key
127.0.0.1:6379> lrange key 0 -1 1) "a" 2) "111" 3) "b" 4) "222" 5) "c" 6) "d" 127.0.0.1:6379> llen key (integer) 6 127.0.0.1:6379> llen key2 (integer) 0返回值:
返回列表中元素的数量。如果该
key
对应的不是一个列表,或者该列表为空,返回0
。如果
key
不存在,返回0
。总结:
llen
命令用于获取 redis 列表的长度,返回列表中元素的数量。如果列表为空或不存在,返回0
。
阻塞版本命令
blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本⼀致,除了:
• 在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的。但如果列表中没有元素,非阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态(如图 2-22 )。
• 命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有一个键对应的列表中可以弹出元素,命令立即返回。
• 如果多个客户端同时多⼀个键执行 pop,则最先执行命令的客户端会得到弹出的元素。图 2-22 阻塞版本的 blpop 和 非阻塞版本 lpop 的区别
演示一下blpop
blpop
命令是 阻塞式弹出(blocking pop)命令,它用于从一个或多个列表中弹出一个元素。如果列表为空,命令会阻塞,直到有元素可弹出为止,或者超时。语法:blpop key [key ...] timeout
此时再开一个服务器去增加key里面的元素
此时发现它在100内只有接收到key中是否有信息即可
返回值:
如果成功弹出了元素,返回一个列表,包含两个元素:
第一个元素是列表名称
key
。第二个元素是从该列表中弹出的值。
如果在
timeout
时间内没有元素可弹出,命令返回nil
。总结:
blpop
是 redis 中的阻塞式弹出命令,可以从一个或多个列表中弹出元素。它会阻塞直到列表中有元素可供弹出,或者超时。如果超时,命令返回nil
。此命令常用于任务队列或消息队列的实现。
brpop同理blpop
list使用场景
消息队列
redis 可以使用 lpush + brpop 命令组合实现经典的阻塞式生产者-消费者模型队列,
生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式地从队列中 "争抢" 队首元素。通过多个客户端来保证消费的负载均衡和高可用性。
总结
到此这篇关于redis常见数据类型list列表使用详解的文章就介绍到这了,更多相关redis list列表详解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论