Redis-列表类型命令操作笔记

列表类型

命令

1.向列表两端增加元素

 1 # LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度。
 2 LPUSH key value [value …] 
 3 
 4 # LPUSH命令还支持同时增加多个元素,例如:
 5 redis> LPUSH numbers 2 3
 6 (integer) 3
 7 
 8 # 向列表右边增加元素的话则使用RPUSH命令,其用法和LPUSH命令一样:
 9 RPUSH key value [value …]
10 redis> RPUSH numbers 0 −1
11 (integer) 5

 

2.从列表两端弹出元素

1 LPOP key
2  
3 RPOP key

 

3.获取列表中元素的个数

1 LLEN key
2 
3 # 当键不存在时LLEN会返回0:
4 redis> LLEN no_exits_key 
5 (integer) 0

 

4.获得列表片段

 1 LRANGE key start stop
 2 
 3 # 可以获取列表中的所有元素
 4 LRANGE numbers 0 -1
 5 
 6 # 1.LRANGE命令在取得列表片段的同时不会像LPOP一样删除该片段
 7 # 2.LRANGE命令与很多语言中用来截取数组片段的方法slice有一点区别:LRANGE返回的值包含最右边的元素!!!
 8 redis> LRANGE numbers 0 2
 9 1) "2"
10 2) "1"
11 3) "0"
12  
13 # LRANGE命令也支持负索引,表示从右边开始计算序数,如"−1"表示最右边第一个元素,"-2"表示最右边第二个元素,依次类推:
14 redis> LRANGE numbers -2 -1
15 1) "1"
16 2) "0"
17  
18 # 特殊情况处理
19 1.如果start的索引位置比stop的索引位置靠后,则会返回空列表。
20  
21 2.如果stop大于实际的索引范围,则会返回到列表最右边的元素:
22 redis> LRANGE numbers 1 999
23 1) "1"
24 2) "0"

 

5.删除列表中指定的值

 1 LREM key count value
 2 
 3 # LREM命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,LREM命令的执行方式会略有差异。
 4 (1)当count > 0时LREM命令会从列表左边开始删除前count个值为value的元素。
 5 
 6 (2)当count < 0时LREM命令会从列表右边开始删除前|count|个值为value的元素。
 7 
 8 (3)当count = 0是LREM命令会删除所有值为value的元素。例如:
 9 
10 redis> RPUSH numbers 2
11 (integer) 4
12 redis> LRANGE numbers 0 -1
13 1) "2"
14 2) "1"
15 3) "0"
16 4) "2"
17  
18  
19 # 从右边开始删除第一个值为"2"的元素
20 redis> LREM numbers -1 2
21 (integer) 1
22 redis> LRANGE numbers 0 -1
23 1) "2"
24 2) "1"
25 3) "0"

 

6.获得/设置指定索引的元素值

1 LINDEX key index
2  
3 LSET key index value
4  
5 redis> LSET numbers 1 7
6 OK
7 redis> LINDEX numbers 1
8 "7"

 

7.只保留列表指定片段

 1 LTRIM key start end
 2  
 3 LTRIM命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE命令相同。就像这样:
 4  
 5 redis> LRANGE numbers 0 -1
 6 1) "1"
 7 2) "2"
 8 3) "7"
 9 4) "3"
10 "0"
11 redis> LTRIM numbers 1 2
12 OK
13 redis> LRANGE numbers 0 1
14 1) "2"
15 2) "7"
16 
17 LTRIM命令常和LPUSH命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的100条日志,则每次加入新元素时调用一次LTRIM命令即可:
18 LPUSH logs $newLog
19 LTRIM logs 0 99

 

8.向列表中插入元素

 1 # LINSERT命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
 2 
 3 LINSERT key BEFORE|AFTER pivot value
 4 
 5 LINSERT命令的返回值是插入后列表的元素个数。示例如下:
 6 redis> LRANGE numbers 0 -1
 7 1) "2"
 8 2) "7"
 9 3) "0"
10 redis> LINSERT numbers AFTER 7 3
11 (integer) 4
12 redis> LRANGE numbers 0 -1
13 1) "2"
14 2) "7"
15 3) "3"
16 4) "0"
17 redis> LINSERT numbers BEFORE 2 1
18 (integer) 5
19 redis> LRANGE numbers 0 -1
20 1) "1"
21 2) "2"
22 3) "7"
23 4) "3"
24 5) "0"

 

9.将元素从一个列表转到另一个列表

RPOPLPUSH source destination
RPOPLPUSH是个很有意思的命令,从名字就可以看出它的功能:先执行RPOP命令再执行LPUSH命令。RPOPLPUSH命令会先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值,整个过程是原子的。其具体实现可以表示为伪代码:

def rpoplpush ($source, $destination)
  $value = RPOP $source
  LPUSH $destination, $value
  return $value

当把列表类型作为队列使用时,RPOPLPUSH 命令可以很直观地在多个队列中传递数据。当source和destination相同时,RPOPLPUSH命令会不断地将队尾的元素移到队首,借助这个特性我们可以实现一个网站监控系统:使用一个队列存储需要监控的网址,然后监控程序不断地使用RPOPLPUSH命令循环取出一个网址来测试可用性。这里使用RPOPLPUSH命令的好处在于在程序执行过程中仍然可以不断地向网址列表中加入新网址,而且整个系统容易扩展,允许多个客户端同时处理队列。

 

参考链接:https://www.jianshu.com/p/86eee4c13645

 

posted @ 2018-09-19 14:48  大西瓜Paul  阅读(189)  评论(0编辑  收藏  举报
/*增加返回顶部按钮*/ 返回顶部 /*给标题增加蓝色背景长条*/