vnsc5858威尼斯城官网Redis列表类型的常用命令小结

时间:2020-01-11 08:42来源:计算机教程
列表类型介绍 列表类型 列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。 列表类型内部是使用双向链表(double link

列表类型介绍

列表类型

  • 列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
  • 列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的(和从只有20个元素的列表中获取头部或尾部的10条记录的速度是一样的)。不过使用链表的代价是通过索引访问元素比较慢,设想在iPad mini发售当天有1000个人在三里屯的苹果店排队等候购买,这时苹果公司宣布为了感谢大家的排队支持,决定奖励排在第486位的顾客一部免费的iPad mini。为了找到这第486位顾客,工作人员不得不从队首一个一个地数到第486个人。但同时,无论队伍多长,新来的人想加入队伍的话直接排到队尾就好了,和队伍里有多少人没有任何关系。这种情景与列表类型的特性很相似。

这种特性使列表类型能非常快速地完成关系数据库难以应付的场景:如社交网站的新鲜事,我们关心的只是最新的内容,使用列表类型存储,即使新鲜事的总数达到几千万个,获取其中最新的100条数据也是极快的。同样因为在两端插入记录的时间复杂度是0(1),列表类型也适合用来记录日志,可以保证加入新日志的速度不会受到已有日志数量的影响。借助列表类型, Redis还可以作为队列使用。与散列类型键最多能容纳的字段数量相同,一个列表类型键最多能容纳232-1个元素。

列表类型也是一个我们很长要用到的一个类型。比如我们发博客,要用到博客列表。如果没有列表我们就只能遍历键来获取所有文章或一部分文章了,这个语法是keys,但是这个命令需要遍历数据库中的所有键,处于性能方面的考虑,在生产环境是不推荐使用的。

向列表两端增加元素

LPUSH key value [value …]
RPUSH key value [value …]
LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度。

redis> LPUSH numbers 1
(integer) 1

这时numbers键中的数据如图3-8所示。 LPUSH命令还支持同时增加多个元素,例如:
向列表右边增加元素的话则使用RPUSH命令,其用法和LPUSH命令一样:

redis> RPUSH numbers 0-1
(integer) 5

列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加、删除、获取元素,或者某个片段。在redis中,实际上是使用双向链表的方式实现的,所以在列表两端添加删除元素的时间复杂度是O(1),获取的元素越接近两端,速度越快。但是通过索引访问元素就会很慢,尤其是列表很长的时候。但是如果只是获得队列开头或结尾的前多少个元素,这个就和队列长度无关了。所以这里队列非常适合我们的评论功能,以及一些新鲜事等功能的开发,记录日志也很好用。

获取列表中元素的个数

LLEN key
当键不存在时LLEN会返回0:
redis> LLEN numbers
(integer) 3

LLEN命令的功能类似SQL语句SELECT COUNT(* ) FROM table_name,但是LLEN的时间
复杂度为0(1),使用时Redis会直接读取现成的值,而不需要像部分关系数据库(如使用InnoDB
存储引擎的MySQL表)那样需要遍历一遍数据表来统计条目数量。

1、增加元素命令

从列表两端弹出元素

LPOP key
RPOP key
有进有出,LPOP命令可以从列表左边弹出一个元素。LPOP命令执行两步操作:

  • 将列表左边的元素从列表中移除
  • 返回被移除的元素值。例如,从numbers列表左边弹出一个元素(也就是"3"):

向列表两端添加元素:

获得列表片段

LRANGE key start stop
LRANGE命令是列表类型最常用的命令之一,它能够获得列表中的某一片段。 LRANGE命令将返回索引从start到stop之间的所有元素(包含两端的元素)。与大多数人的直觉相同,Redis的列表起始索引为0:
LRANGE命令也支持负索引,表示从右边开始计算序数,如"-1"表示最右边第一个元素, "-2"表示最右边第二个元素,依次类推:

redis> LRANGE numbers -2 -1
1) "1"
2) "0"

显然, LRANGE numbers 0 -1可以获取列表中的所有元素。另外一些特殊情况如下。
(1)如果start的索引位置比stop的索引位置靠后,则会返回空列表。
(2)如果stop大于实际的索引范围,则会返回到列表最右边的元素:

redis> LRANGE numbers 1 999
1) "1"
2) "0"
redis lpush key value [value ...]redis rpush key value [value ...]

删除列表中指定的值

LREM key count value
LREM命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根
据count值的不同, LREM命令的执行方式会略有差异:

  • 当 count>0时LREM命令会从列表左边开始删除前count个值为value的元素;
  • 当 count< 0时LREM 命令会从列表右边开始删除前|count|个值为value的元素;
  • 当 count=0是LREM命令会删除所有值为value的元素。例如:

    redis> RPUSH numbers 2
    (integer) 4
    redis> LRANGE numbers 0 -1
    1) "2"
    2) "1"
    3) "0"
    4) "2"
    

    #### 从右边开始删除第一个值为"2"的元素

    redis> LREM numbers -1 2
    (integer) 1
    redis> LRANGE numbers 0 -1
    1) "2"
    2) "1"
    3) "0"
    

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

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"

这里也很容易明白,lpush的l是left,向列表左边添加元素,r自然就是right右边的意思了。

只保留列表指定片段

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
C:Program FilesRedisredis-cli.exe127.0.0.1:6379 keys *(empty list or set)127.0.0.1:6379 lpush mylist 0(integer) 1127.0.0.1:6379 rpush mylist 1(integer) 2127.0.0.1:6379 lpush mylist -1 -2(integer) 4127.0.0.1:6379 lrange mylist 0 -11) "-2"2) "-1"3) "0"4) "1"

向列表中插入元素

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"

返回值是列表的长度。这里push的值可以是多个,但是有一点要说明一下。像是上面这样左边push了两个值-1、-2,实际上现在列表的值是这样排序的,-2、-1、0、1,所以就算是同时push多个,实际上也是一个一个插入列表的,只不过这些操作都会是原子的。

将元素从一个列表转到另一个列表R

POPLPUSH source destination

RPOPLPUSH是个很有意思的命令,从名字就可以看出它的功能:先执行RPOP命令再执行LPUSH 命令。 RPOPLPUSH命令会先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值,整个过程是原子的。
当把列表类型作为队列使用时, RPOPLPUSH命令可以很直观地在多个队列中传递数据。
当 source和destination相同时, RPOPLPUSH命令会不断地将队尾的元素移到队首,借助这个特性我们可以实现一个网站监控系统:使用一个队列存储需要监控的网址,然后监控程序不断地使用RPOPLPUSH命令循环取出一个网址来测试可用性。这里使用RPOPLPUSH命令的好处在于在程序执行过程中仍然可以不断地向网址列表中加入新网址,而且整个系统容易扩展,允许多个客户端同时处理队列。

2、弹出元素命令

redis lpop keyredis rpop key

这里就很好理解了,分别是从左弹出,从右弹出,返回值是弹出的值。

127.0.0.1:6379 lrange mylist 0 -11) "-2"2) "-1"3) "0"4) "1"127.0.0.1:6379 lpop mylist"-2"127.0.0.1:6379 rpop mylist"1"127.0.0.1:6379 lrange mylist 0 -11) "-1"2) "0"

综合上面四条命令,可以实现栈和队列了。

栈:lpushlpop或者使用rpushrpop

队列:lpushrpop或者使用rpushlpop

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

redis llen key

当键不存在是返回0,这个如果一路学下来都可以猜到了。这里redis执行这条命令的时间复杂度是O(1),不像关系型数据库中的O(N)。

127.0.0.1:6379 llen mylist(integer) 2

4、获取列表片段

redis lrange key start stop

lrange命令比较常用,返回从start到stop的所有元素的列表,start和stop都是从0开始。

127.0.0.1:6379 lrange mylist 0 -11) "-1"2) "0"

lrange还支持负值索引,这里是负值大家可以把负号加值直接理解成从从右数第多少个。

例如现在numbers的值是-2、-1、0、1,我们要是执行lrange numbers -2 -1,就会得到最后两个值。还有lrange numbers 0 -1是我们常用的用来获取全部列表的命令。

这里有两点要注意一下:

编辑:计算机教程 本文来源:vnsc5858威尼斯城官网Redis列表类型的常用命令小结

关键词: