当前位置:嗨网首页>书籍在线阅读

17-命令拾遗

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

3.4.4 命令拾遗

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

LINDEX key index
LSET key index value

如果要将列表类型当作数组来用, LINDEX 命令是必不可少的。 LINDEX 命令用来返回指定索引的元素,索引从0开始。如:

redis>LINDEX numbers 0
"2"

如果 index 是负数则表示从右边开始计算的索引,最右边元素的索引是−1。例如:

redis>LINDEX numbers -1
"0"

LSET 是另一个通过索引操作列表的命令,它会将索引为 index 的元素赋值为 value 。例如:

redis>LSET numbers 1 7
OK
redis>LINDEX numbers 1
"7"

2.只保留列表指定片段

LTRIM key start end

LTRIM 命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和 LRANGE 命令相同。就像这样:

redis>LRANGE numbers 0 -1
1) "1"
2) "2"
3) "7"
4) "3"
"0"
redis> LTRIM numbers 1 2
OK
redis>LRANGE numbers 0 1
1) "2"
2) "7"

LTRIM 命令常和 LPUSH 命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的100条日志,则每次加入新元素时调用一次 LTRIM 命令即可:

LPUSH logs $newLog
LTRIM logs 0 99

3.向列表中插入元素

LINSERT key BEFORE|AFTER pivot value

LINSERT 命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是 BEFORE 还是 AFTER 来决定将 value 插入到该元素的前面还是后面。

LINSERT 命令的返回值是插入后列表的元素个数。示例如下:

redis>LRANGE numbers 0 -1
1) "2"
2) "7"
3) "0"
redis>LINSERT numbers AFTER 7 3
(integer) 4
redis>LRANGE numbers 0 -1
1) "2"
2) "7"
3) "3"
4) "0"
redis>LINSERT numbers BEFORE 2 1
(integer) 5
redis>LRANGE numbers 0 -1
1) "1"
2) "2"
3) "7"
4) "3"
5) "0"

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

RPOPLPUSH source destination

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

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

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