0


【Redis篇】 List 列表

在 Redis 中,List 是一种非常常见的数据类型,用于表示一个有序的字符串集合。与传统的链表结构类似,Redis 的 List 支持在两端进行高效的插入和删除操作,因此非常适合实现队列(Queue)和栈(Stack)等数据结构。

Redis List 的基本概念

  • 有序的字符串集合:List中的元素按插入顺序排列,每个元素都是一个字符串。
  • 双端队列:Redis List 是一个双端队列(Deque),允许你在列表的两端高效地进行操作(插入和删除)。
  • 最大长度:Redis 的 List 数据类型没有最大长度限制,理论上可以存储无限多的元素,除非内存不足。

List命令:

LPUSH

**

  1. LPUSH

命令用于将一个或多个元素插入到列表的头部(即左侧)。如果列表不存在,Redis 会自动创建一个空列表并执行插入操作。**

语法: LPUSH key value [value ...]

  1. 127.0.0.1:6379> lpush key 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> lrange key 0 -1
  4. 1) "4"
  5. 2) "3"
  6. 3) "2"
  7. 4) "1"

返回值

  • 返回插入元素后的列表长度。

LPUSHX

**

  1. LPUSHX

是一个用于将元素推入到列表(list)头部的命令,但与

  1. LPUSH

不同的是,

  1. LPUSHX

只有在列表已存在的情况下才会执行操作。如果列表不存在,

  1. LPUSHX

不会做任何操作,也不会创建新的列表。 **

语法:****LPUSHX key value

  1. 127.0.0.1:6379> lpush key world
  2. (integer) 1
  3. 127.0.0.1:6379> lpushx key hello
  4. (integer) 2
  5. 127.0.0.1:6379> lpushx key2 hi
  6. (integer) 0
  7. 127.0.0.1:6379> lrange key 0 -1
  8. 1) "hello"
  9. 2) "world"
  10. 127.0.0.1:6379> lrange key2 0 -1
  11. (empty array)

总结:

**

  1. LPUSHX

用于将元素添加到已经存在的列表中,它不会创建新的列表,这与

  1. LPUSH

(无论列表是否存在都创建新列表)有所不同。**

RPUSH

**

  1. RPUSH

命令用于将一个或多个元素插入到列表的尾部(即右侧)。如果列表不存在,Redis 会自动创建一个空列表并执行插入操作。**

语法:RPUSH key value [value ...]

  1. 127.0.0.1:6379> rpush key 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> rpush key 5 6 7 8
  4. (integer) 8
  5. 127.0.0.1:6379> lrange key 0 -1
  6. 1) "1"
  7. 2) "2"
  8. 3) "3"
  9. 4) "4"
  10. 5) "5"
  11. 6) "6"
  12. 7) "7"
  13. 8) "8"

返回值:

  • 返回插入元素后的列表长度。

RPUSHX 同理 LPUSHX

LRANGE

**

  1. LRANGE

命令用于获取列表中的一个指定范围的元素。你可以指定开始和结束的索引位置,然后 Redis 会返回该范围内的所有元素。**

语法:LRANGE key start stop

  1. 127.0.0.1:6379> lrange key 0 -1
  2. 1) "1"
  3. 2) "2"
  4. 3) "3"
  5. 4) "4"
  6. 5) "5"
  7. 6) "6"
  8. 7) "7"
  9. 8) "8"
  10. 127.0.0.1:6379> lrange key 0 3
  11. 1) "1"
  12. 2) "2"
  13. 3) "3"
  14. 4) "4"
  15. 127.0.0.1:6379> lrange key 0 100
  16. 1) "1"
  17. 2) "2"
  18. 3) "3"
  19. 4) "4"
  20. 5) "5"
  21. 6) "6"
  22. 7) "7"
  23. 8) "8"
  24. 127.0.0.1:6379> lrange key 8 10
  25. (empty array)
  26. 127.0.0.1:6379> lrange key -8 -1
  27. 1) "1"
  28. 2) "2"
  29. 3) "3"
  30. 4) "4"
  31. 5) "5"
  32. 6) "6"
  33. 7) "7"
  34. 8) "8"

返回值:

  • 返回指定范围内的所有元素。如果范围超出列表长度,Redis 会返回所有符合范围条件的元素。

总结:

  • LRANGE 用于获取 Redis 列表中指定范围的元素。
  • 支持负数索引,可以从列表尾部获取元素。
  • 如果 startstop 超出了列表的实际长度,Redis 会自动调整范围。

LPOP

**

  1. LPOP

命令用于从列表的头部(左侧)移除并返回一个元素。执行该命令时,列表的第一个元素会被移除,并返回这个被移除的元素。如果列表为空,

  1. LPOP

会返回

  1. nil

。**

语法:LPOP key

  1. 127.0.0.1:6379> rpush key 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> lpop key
  4. "1"
  5. 127.0.0.1:6379> lpop key
  6. "2"
  7. 127.0.0.1:6379> lpop key
  8. "3"
  9. 127.0.0.1:6379> lpop key
  10. "4"
  11. 127.0.0.1:6379> lpop key
  12. (nil)

返回值:

  • 返回被移除的列表元素。
  • 如果列表为空,返回 nil

总结:

**

  1. LPOP

是一个用于从 Redis 列表左侧移除并返回一个元素的命令。如果列表为空,返回

  1. nil

。**

RPOP 同理
**

  1. RPOP

命令用于从列表的尾部(右侧)移除并返回一个元素。执行该命令时,列表的最后一个元素会被移除,并返回该元素。如果列表为空,

  1. RPOP

会返回

  1. nil

。**

LINDEX

**

  1. LINDEX

命令用于获取列表中指定位置的元素。你可以通过指定一个索引来获取列表中对应位置的元素。**

语法:LINDEX key index

  1. 127.0.0.1:6379> rpush key 1 2 3 4 5 6 7 8
  2. (integer) 8
  3. 127.0.0.1:6379> lindex key 0
  4. "1"
  5. 127.0.0.1:6379> lindex key 7
  6. "8"
  7. 127.0.0.1:6379> lindex -1
  8. 127.0.0.1:6379> lindex key -1
  9. "8"
  10. 127.0.0.1:6379> lindex key -7
  11. "2"
  12. 127.0.0.1:6379> lindex key 9
  13. (nil)

返回值:

** 返回指定位置的元素。**

** 如果指定的索引超出了列表的范围,返回

  1. nil

。**

总结:

**

  1. LINDEX

用于获取 Redis 列表中指定位置的元素。可以通过正数索引或负数索引来指定位置。如果索引超出范围,返回

  1. nil

。这是一个读取操作,而不会改变列表内容**


LINSERT

**

  1. LINSERT

命令用于在列表中指定位置插入一个元素。你可以在列表的 左侧 或 右侧 插入元素,依据你指定的插入位置。**
语法:LINSERT key BEFORE|AFTER pivot element

  1. 127.0.0.1:6379> rpush key a b c d
  2. (integer) 4
  3. 127.0.0.1:6379> linsert key before b 111
  4. (integer) 5
  5. 127.0.0.1:6379> linsert key after b 222
  6. (integer) 6
  7. 27.0.0.1:6379> linsert key before e 333
  8. (integer) -1
  9. 127.0.0.1:6379> lrange key 0 -1
  10. 1) "a"
  11. 2) "111"
  12. 3) "b"
  13. 4) "222"
  14. 5) "c"
  15. 6) "d"

返回值:

** 如果操作成功,返回列表的新长度。**

** 如果

  1. pivot

元素在列表中不存在,则不插入任何元素,返回

  1. -1

。**

总结:

**

  1. LINSERT

命令在 Redis 列表中指定位置插入一个新元素。可以在指定元素的 前 或 后 插入。它是一个修改列表的命令,成功执行后返回新的列表长度,如果指定的

  1. pivot

元素不存在,则返回

  1. -1

。**

LLEN

**

  1. LLEN

命令用于获取列表的长度,即列表中元素的数量。**

语法:LLEN key

  1. 127.0.0.1:6379> lrange key 0 -1
  2. 1) "a"
  3. 2) "111"
  4. 3) "b"
  5. 4) "222"
  6. 5) "c"
  7. 6) "d"
  8. 127.0.0.1:6379> llen key
  9. (integer) 6
  10. 127.0.0.1:6379> llen key2
  11. (integer) 0

返回值:

**返回列表中元素的数量。如果该

  1. key

对应的不是一个列表,或者该列表为空,返回

  1. 0

。**

**如果

  1. key

不存在,返回

  1. 0

。**

总结:

**

  1. LLEN

命令用于获取 Redis 列表的长度,返回列表中元素的数量。如果列表为空或不存在,返回

  1. 0

。**

阻塞版本命令

** blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本⼀致,除了:
• 在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的。但如果列表中没有元素,非阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态(如图 2-22 )。
• 命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有一个键对应的列表中可以弹出元素,命令立即返回。
• 如果多个客户端同时多⼀个键执行 pop,则最先执行命令的客户端会得到弹出的元素。 **

图 2-22 阻塞版本的 blpop 和 非阻塞版本 lpop 的区别

演示一下BLPOP

  1. BLPOP

命令是 阻塞式弹出(Blocking Pop)命令,它用于从一个或多个列表中弹出一个元素。如果列表为空,命令会阻塞,直到有元素可弹出为止,或者超时。

语法:BLPOP key [key ...] timeout

此时再开一个服务器去增加key里面的元素

此时发现它在100内只有接收到key中是否有信息即可

返回值:

  1. 如果成功弹出了元素,返回一个列表,包含两个元素:
  2. 第一个元素是列表名称
  1. key

  1. 第二个元素是从该列表中弹出的值。
  2. 如果在
  1. timeout

时间内没有元素可弹出,命令返回

  1. nil

总结:

**

  1. BLPOP

是 Redis 中的阻塞式弹出命令,可以从一个或多个列表中弹出元素。它会阻塞直到列表中有元素可供弹出,或者超时。如果超时,命令返回

  1. nil

。此命令常用于任务队列或消息队列的实现。**

BRPOP同理BLPOP

List使用场景

消息队列

Redis 可以使用 lpush + brpop 命令组合实现经典的阻塞式生产者-消费者模型队列,
生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式地从队列中 "争抢" 队首元素。通过多个客户端来保证消费的负载均衡和高可用性。

结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!

标签: redis 数据库 缓存

本文转载自: https://blog.csdn.net/chaodddddd/article/details/144226924
版权归原作者 呼啦啦啦啦啦啦啦啦 所有, 如有侵权,请联系我们删除。

“【Redis篇】 List 列表”的评论:

还没有评论