LRANGE:获取指定索引范围上的元素

用户除了可以使用 LINDEX 命令获取给定索引上的单个元素之外,还可以使用 LRANGE 命令获取给定索引范围上的多个元素:

  1. LRANGE list start end

LRANGE 命令接受一个列表、一个开始索引和一个结束索引作为参数,然后依次返回列表从开始索引到结束索引范围内的所有元素,其中开始索引和结束索引对应的元素也会被包含在命令返回的元素当中。

作为例子,以下代码展示了如何使用 LRANGE 命令去获取 alphabets 列表在不同索引范围内的元素:

  1. redis> LRANGE alphabets 0 3 -- 获取列表索引 0 至索引 3 上的所有元素
  2. 1) "a" -- 位于索引 0 上的元素
  3. 2) "b" -- 位于索引 1 上的元素
  4. 3) "c" -- 位于索引 2 上的元素
  5. 4) "d" -- 位于索引 3 上的元素
  6.  
  7. redis> LRANGE alphabets 2 6
  8. 1) "c"
  9. 2) "d"
  10. 3) "e"
  11. 4) "f"
  12. 5) "g"
  13.  
  14. redis> LRANGE alphabets -5 -1
  15. 1) "d"
  16. 2) "e"
  17. 3) "f"
  18. 4) "g"
  19. 5) "h"
  20.  
  21. redis> LRANGE alphabets -7 -4
  22. 1) "b"
  23. 2) "c"
  24. 3) "d"
  25. 4) "e"

图 4-18 展示了这些 LRANGE 命令是如何根据给定的索引范围去获取列表元素的。


图 4-18 LRANGE 命令获取范围内元素的过程_images/IMAGE_LRANGE_1.jpeg_images/IMAGE_LRANGE_2.jpeg


获取列表包含的所有元素

一个快捷地获取列表包含的所有元素的方法,就是使用 0 作为起始索引、 -1 作为结束索引去调用 LRANGE 命令,这种方法非常适用于查看长度较短的列表:

  1. redis> LRANGE alphabets 0 -1
  2. 1) "a"
  3. 2) "b"
  4. 3) "c"
  5. 4) "d"
  6. 5) "e"
  7. 6) "f"
  8. 7) "g"
  9. 8) "h"

处理超出范围的索引

LINDEX 一样,LRANGE 命令也需要处理超出范围的索引:

  • 如果用户给定的起始索引和结束索引都超出了范围,那么 LRANGE 命令将返回空列表作为结果;

  • 如果用户给定的其中一个索引超出了范围,那么 LRANGE 命令将对超出范围的索引进行修正,然后再执行实际的范围获取操作;其中超出范围的起始索引会被修正为 0 ,而超出范围的结束索引则会被修正为 -1

以下代码展示了 LRANGE 命令在遇到两个超出范围的索引时,返回空列表的例子:

  1. redis> LRANGE alphabets 50 100
  2. (empty list or set)
  3.  
  4. redis> LRANGE alphabets -100 -50
  5. (empty list or set)

另一方面,以下代码展示了 LRANGE 命令在遇到只有一个超出范围的索引时,对索引进行修正并返回元素的例子:

  1. redis> LRANGE alphabets -100 5
  2. 1) "a" -- 位于索引 0 上的元素
  3. 2) "b"
  4. 3) "c"
  5. 4) "d"
  6. 5) "e"
  7. 6) "f" -- 位于索引 5 上的元素
  8.  
  9. redis> LRANGE alphabets 5 100
  10. 1) "f" -- 位于索引 5 上的元素
  11. 2) "g"
  12. 3) "h" -- 位于索引 -1 上的元素

在执行 LRANGE alphabets -100 5 调用时,LRANGE 命令会把超出范围的起始索引 -100 修正为 0 ,然后执行 LRANGE alphabets 0 5 调用;而在执行 LRANGE alphabets 5 100 调用时,LRANGE 命令会把超出范围的结束索引 100 修正为 -1 ,然后执行 LRANGE alphabets 5 -1 调用。

其他信息

属性
复杂度O(N) ,其中 N 为给定列表的长度。
版本要求LRANGE 命令从 Redis 1.0.0 开始可用。