LREM:从列表中移除指定元素

用户可以通过 LREM 命令移除列表中的指定元素:

  1. LREM list count element

count 参数的值决定了 LREM 命令移除元素的方式:

  • 如果 count 参数的值等于 0 ,那么 LREM 命令将移除列表中包含的所有指定元素;

  • 如果 count 参数的值大于 0 ,那么 LREM 命令将从列表的左端开始向右进行检查,并移除最先发现的 count 个指定元素;

  • 如果 count 参数的值小于 0 ,那么 LREM 命令将从列表的右端开始向左进行检查,并移除最先发现的 abs(count) 个指定元素(abs(count) 即是 count 的绝对值);

LREM 命令在执行完毕之后将返回被移除的元素数量作为返回值。

举个例子,对于以下三个包含相同元素的列表来说:

  1. redis> RPUSH sample1 "a" "b" "b" "a" "c" "c" "a"
  2. (integer) 7
  3.  
  4. redis> RPUSH sample2 "a" "b" "b" "a" "c" "c" "a"
  5. (integer) 7
  6.  
  7. redis> RPUSH sample3 "a" "b" "b" "a" "c" "c" "a"
  8. (integer) 7

执行以下命令将移除 sample1 列表包含的所有 "a" 元素:

  1. redis> LREM sample1 0 "a"
  2. (integer) 3 -- 移除了三个 "a" 元素
  3.  
  4. redis> LRANGE sample1 0 -1
  5. 1) "b" -- 列表里面已经不再包含 "a" 元素
  6. 2) "b"
  7. 3) "c"
  8. 4) "c"

而执行以下命令将移除 sample2 列表最靠近列表左端的两个 "a" 元素:

  1. redis> LREM sample2 2 "a"
  2. (integer) 2 -- 移除了两个 "a" 元素
  3.  
  4. redis> LRANGE sample2 0 -1
  5. 1) "b"
  6. 2) "b"
  7. 3) "c"
  8. 4) "c"
  9. 5) "a"

因为上面的 LREM 命令只要求移除最先发现的两个 "a" 元素,所以位于列表最右端的 "a" 元素并没有被移除,图 4-23 展示了这个 LREM 命令的执行过程。


图 4-23 从 sample2 列表中移除最靠近列表左端的两个 "a" 元素_images/IMAGE_REMOVE_LEFT.jpeg


最后,执行以下命令将移除 sample3 列表最靠近列表右端的两个 "a" 元素:

  1. redis> LREM sample3 -2 "a"
  2. (integer) 2 -- 移除了两个 "a" 元素
  3.  
  4. redis> LRANGE sample3 0 -1
  5. 1) "a"
  6. 2) "b"
  7. 3) "b"
  8. 4) "c"
  9. 5) "c"

因为上面的 LREM 调用只要求移除最先发现的两个 "a" 元素,所以位于列表最左端的 "a" 元素并没有被移除,图 4-24 展示了这个 LREM 调用的执行过程。


图 4-24 从 sample3 列表里面移除最靠近列表右端的两个 "a" 元素_images/IMAGE_REMOVE_RIGHT.jpeg


其他信息

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