• LTRIM key start stop
    • 注意LTRIM命令和编程语言区间函数的区别
    • 超出范围的下标
    • 返回值
    • 代码示例

    LTRIM key start stop

    可用版本: >= 1.0.0
    时间复杂度: O(N), N 为被移除的元素的数量。

    对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

    举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。

    下标(index)参数 startstop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。

    你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

    key 不是列表类型时,返回一个错误。

    LTRIM 命令通常和 LPUSH key value [value …] 命令或 RPUSH key value [value …] 命令配合使用,举个例子:

    1. LPUSH log newest_log
    2. LTRIM log 0 99

    这个例子模拟了一个日志程序,每次将最新日志 newest_log 放到 log 列表中,并且只保留最新的 100 项。注意当这样使用 LTRIM 命令时,时间复杂度是O(1),因为平均情况下,每次只有一个元素被移除。

    注意LTRIM命令和编程语言区间函数的区别

    假如你有一个包含一百个元素的列表 list ,对该列表执行 LTRIM list 0 10 ,结果是一个包含11个元素的列表,这表明 stop 下标也在 LTRIM 命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的 Range.newArray#slice 和Python的 range() 函数。

    超出范围的下标

    超出范围的下标值不会引起错误。

    如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,或者 start > stop , LTRIM 返回一个空列表(因为 LTRIM 已经将整个列表清空)。

    如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end

    返回值

    命令执行成功时,返回 ok

    代码示例

    1. # 情况 1: 常见情况, start 和 stop 都在列表的索引范围之内
    2.  
    3. redis> LRANGE alpha 0 -1 # alpha 是一个包含 5 个字符串的列表
    4. 1) "h"
    5. 2) "e"
    6. 3) "l"
    7. 4) "l"
    8. 5) "o"
    9.  
    10. redis> LTRIM alpha 1 -1 # 删除 alpha 列表索引为 0 的元素
    11. OK
    12.  
    13. redis> LRANGE alpha 0 -1 # "h" 被删除了
    14. 1) "e"
    15. 2) "l"
    16. 3) "l"
    17. 4) "o"
    18.  
    19.  
    20. # 情况 2: stop 比列表的最大下标还要大
    21.  
    22.  
    23. redis> LTRIM alpha 1 10086 # 保留 alpha 列表索引 1 至索引 10086 上的元素
    24. OK
    25.  
    26. redis> LRANGE alpha 0 -1 # 只有索引 0 上的元素 "e" 被删除了,其他元素还在
    27. 1) "l"
    28. 2) "l"
    29. 3) "o"
    30.  
    31.  
    32. # 情况 3: start 和 stop 都比列表的最大下标要大,并且 start < stop
    33.  
    34. redis> LTRIM alpha 10086 123321
    35. OK
    36.  
    37. redis> LRANGE alpha 0 -1 # 列表被清空
    38. (empty list or set)
    39.  
    40.  
    41. # 情况 4: start 和 stop 都比列表的最大下标要大,并且 start > stop
    42.  
    43. redis> RPUSH new-alpha "h" "e" "l" "l" "o" # 重新建立一个新列表
    44. (integer) 5
    45.  
    46. redis> LRANGE new-alpha 0 -1
    47. 1) "h"
    48. 2) "e"
    49. 3) "l"
    50. 4) "l"
    51. 5) "o"
    52.  
    53. redis> LTRIM new-alpha 123321 10086 # 执行 LTRIM
    54. OK
    55.  
    56. redis> LRANGE new-alpha 0 -1 # 同样被清空
    57. (empty list or set)