您的位置:首页 > 数据库 > Redis

redis基础之数据类型--列表类型

2014-11-08 15:12 387 查看
列表类型(list)可以存储一个有序的字符串列表,常用的操作室向列表两端添加元素,或者获得列表的某一个片段。列表类型内部是使用双向链表(double linked list)实现的,所有向列表两端添加元素时间复杂度为O(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部和尾部的记录也是极快的。不过使用链表的代价是通过索引访问元素比较慢,必须从头或者尾开始索引。这种特性使得列表类型能够非常快速地完成关系数据库难以应对的场合:如社交网络的新鲜事,我们只是关心最新的内容,使用类表类型存储,即使新鲜事有几万个,获得最新的前100个也是很快的。同样因为在两端插入记录的时间复杂度为O(1),列表类型适合用来记录日志,可以保证加入新日志的速度不会受到已有日志数量的影响。与散列类型键最多容量的字段数量相同,一个列表类型键最多能容纳2^32-1个元素。

1.向两端增加元素

LPUSH key value [value ...]
RPUSH key value [value ...]
LPUSH命令用来向类表左边(Left)增加元素,RPUSH命令向列表右边(Right)增加元素,返回值表示增加元素后列表的长度。
127.0.0.1:6379> LPUSH numbers 1
(integer) 1
127.0.0.1:6379> LPUSH numbers 2 3
(integer) 3
127.0.0.1:6379> RPUSH numbers 0 -1
(integer) 5
Redis中numbers此时应该为【3 2 1 0 -1】

2.从列表两端弹出元素

LPOP key
RPOP key
LPOP和RPOP分别从左边和右边弹出元素,返回弹出的元素。弹出分为两步:第一步是将列表左边的元素从列表中删除,第二步是返回被移除的元素。例如,从numbers左边和右边分别弹出一个元素:
127.0.0.1:6379> LPOP numbers
"3"
127.0.0.1:6379> RPOP numbers
"-1"
此时numbers键中的数据应该为:【2 1 0】。结合PUSH和POP命令,可以使用列表来模拟栈和队列的操作。

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

LLEN key
127.0.0.1:6379> LLEN numbers
(integer) 3


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

4.获得列表片段

LRANGE key start stop
LRANGE命令是列表类型最常用的命令之一,它能够获得列表中的某一片段。LRANGE命令将返回索引从start到stop之间的所有元素(包括两端的元素),Redis的列表起始索引为0:
127.0.0.1:6379> LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"
LRANGE命令在获取元素的同时不会像POP那样删除元素,同时LRANGE命令也支持负索引,表示从右边开始计算序数,如“-1”表示最右边第一个元素,“-2”表示最右边第二个元素,依次类推:
127.0.0.1:6379> LRANGE numbers -2 -1
1) "1"
2) "0"
显然,LRANGE numbers 0 -1可以获得列表中的所有元素。另外一些特殊情况下:

如果start的索引位置比stop的索引位置靠后,则会返回空列表;
如果stop大于实际的索引范围,则会返回到类表最右边的元素

5.删除列表中的指定值

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

当count>0时LREM命令会从列表左边开始删除count个值为value的元素
当count<0时LREM命令会从列表的右边删除count个值为value的元素
当count=0时LREM命令会删除所有的值为value的元素

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

LINDEX key index
LSET key index value
LINDEX命令用来返回指定索引的元素,索引从0开始,index也可以为负数,表示从右数第几个:
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> LINDEX numbers 1
"1"
127.0.0.1:6379> LINDEX numbers -1
"0"
127.0.0.1:6379> LINDEX numbers -3
"2"
LSET会将索引为index的元素赋值为value,例如:
127.0.0.1:6379> LSET numbers 1 7
OK
127.0.0.1:6379> LINDEX numbers 1
"7"


7.只保留列表指定片段

LTRIM key start end
LTRIM命令可以删除指定索引范围之外的所有元素,其指定范围的方法和LRANGE命令相似

127.0.0.1:6379> LRANGE numbers 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "7"
6) "0"
127.0.0.1:6379> LTRIM numbers 2 4
OK
127.0.0.1:6379> LRANGE numbers 0 -1
1) "3"
2) "2"
3) "7"
127.0.0.1:6379>
LTRIM命令常和LPUSH命令一起使用来限制列表中元素的数量,比如记录日志时,我们常希望保留最新的100条日志,每次新加入元素时调用一次LTRIM命令即可:
127.0.0.1:6379> LPUSH logs $newLog
127.0.0.1:6379> LTRIM  logs 0 99


8.向列表中插入元素

LINSERT key BEFORE | AFTER p_value value
LINSERT 命令首先会在列表中从左到右查找值为p_value的元素,然后根据第二个参数是BEFOR还是AFTER来决定将value插入到该元素的前面还是后面。LINSERT的返回值是插入后列表的元素的个数。
127.0.0.1:6379> LRANGE numbers 0 -1
1) "3"
2) "2"
3) "7"
127.0.0.1:6379> LINSERT numbers AFTER 2 3
(integer) 4
127.0.0.1:6379> LRANGE numbers 0 -1
1) "3"
2) "2"
3) "3"
4) "7"
127.0.0.1:6379> LINSERT numbers BEFORE 2 4
(integer) 5
127.0.0.1:6379> LRANGE numbers 0 -1
1) "3"
2) "4"
3) "2"
4) "3"
5) "7"


9.列表转移

RPOPLPUSH source destination
RPOPLPUSH从字面上就可以看出它的功能,先执行RPOP命令再执行LPUSH命令。RPOPLPUSH命令先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值,整个过程是原子操作的。
当把列表当做队列使用时,RPOPLPUSH命令可以很直观地在多个队列中传递数据。当source和destination相同时,RPOPLPUSH命令会不断地将队尾的元素移动到队首,借助这个命令,可以实现一个网站监控系统:使用一个队列存储需要监控的网址,然后监控程序不断地使用RPOPLPUSH命令循环取出一个网址来测试可用性。这里使用RPOPLPUSH命令的好处在于:在程序执行过程中扔可以不断地向网址列表中增加新的网址,而且整个系统容易扩展,允许多个客户端同时处理队列。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: