设为首页 加入收藏

TOP

小贝_redislist类型学习(五)
2015-11-21 01:41:17 来源: 作者: 【 】 浏览:9
Tags:小贝 _redislist 类型 学习
86 4

OK

127.0.0.1:6379>lrange alpha 0 -1 # 列表同样被清空

(emptylist or set)

?

14、lindex

lindexkey index

返回列表key中,下标为index的元素。

下标(index)参数start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。

你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。

如果key不是列表类型,返回一个错误。

时间复杂度:

O(N),N为到达下标index过程中经过的元素数量。

因此,对列表的头元素和尾元素执行lindex命令,复杂度为O(1)。

返回值:

列表中下标为index的元素。

如果index参数的值不在列表的区间范围内(out of range),返回nil。

127.0.0.1:6379>lpush mylist "World"

(integer)1

127.0.0.1:6379>lpush mylist "Hello"

(integer)2

127.0.0.1:6379>lindex mylist 0

"Hello"

127.0.0.1:6379>lindex mylist -1

"World"

127.0.0.1:6379>lindex mylist 3 # index不在mylist的区间范围内

(nil)

?

15、linsert

linsertkey BEFORE|AFTER pivot value

将值value插入到列表key当中,位于值pivot之前或之后。

当pivot不存在于列表key时,不执行任何操作。

当key不存在时,key被视为空列表,不执行任何操作。

如果key不是列表类型,返回一个错误。

时间复杂度:

O(N),N为寻找pivot过程中经过的元素数量。

返回值:

如果命令执行成功,返回插入操作完成之后,列表的长度。

如果没有找到pivot,返回-1。

如果key不存在或为空列表,返回0。

127.0.0.1:6379>rpush mylist "Hello"

(integer)1

127.0.0.1:6379>rpush mylist "World"

(integer)2

127.0.0.1:6379>linsert mylist BEFORE "World" "There"

(integer)3

127.0.0.1:6379>lrange mylist 0 -1

1)"Hello"

2)"There"

3)"World"

127.0.0.1:6379>linsert mylist BEFORE "go" "let's" # 对一个非空列表插入,查找一个不存在的pivot

(integer)-1 # 失败

127.0.0.1:6379>EXISTS fake_list # 对一个空列表执行linsert命令

(integer)0

127.0.0.1:6379>linsert fake_list BEFORE "nono" "gogogog"

(integer)0 # 失败

?

16、rpoplpush

rpoplpushsource destination

命令rpoplpush在一个原子时间内,执行以下两个动作:

将列表source中的最后一个元素(尾元素)弹出,并返回给客户端。

将source弹出的元素插入到列表destination,作为destination列表的的头元素。

举个例子,你有两个列表source和destination,source列表有元素a, b, c,destination列表有元素x, y, z,执行rpoplpush source destination之后,source列表包含元素a, b,destination列表包含元素c, x, y, z ,并且元素c被返回。

如果source不存在,值nil被返回,并且不执行其他动作。

如果source和destination相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。

时间复杂度:

O(1)

返回值:

假如在指定时间内没有任何元素被弹出,则返回一个nil和等待时长。

反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。

#相关数据

127.0.0.1:6379>rpush alpha a

(integer)1

127.0.0.1:6379>rpush alpha b

(integer)2

127.0.0.1:6379>rpush alpha c

(integer)3

127.0.0.1:6379>rpush alpha d

(integer)4

?

#情况1:source和destination不同

127.0.0.1:6379>lrange alpha 0 -1 # 查看所有元素

1)"a"

2)"b"

3)"c"

4)"d"

127.0.0.1:6379>rpoplpush alpha reciver # 执行一次rpoplpush看看

"d"

127.0.0.1:6379>lrange alpha 0 -1

1)"a"

2)"b"

3)"c"

127.0.0.1:6379>lrange reciver 0 -1

1)"d"

#情况2:source和destination相同

127.0.0.1:6379>rpoplpush alpha alpha

"c"

127.0.0.1:6379>lrange alpha 0 -1 # 原来的尾元素"c"被放到了头部

1)"c"

2)"a"

3)"b"

?

设计模式:一个安全的队列

Redis的列表经常被用作队列(queue),用于在不同程序之间有序地交换消息(message)。一个程序(称之为生产者,producer)通过lpush命令将消息放入队列中,而另一个程序(称之为消费者,consumer)通过rpop命令取出队列中等待时间最长的消息。

不幸的是,在这个过程中,一个消费者可能在获得一个消息之后崩溃,而未执行完成的消息也因此丢失。

使用rpoplpush命令可以解决这个问题,因为它在返回一个消息之余,还将该消息添加到另一个列表当中,另外的这个列表可以用作消息的备份表:假如一切正常,当消费者完成该消息的处理之后,可以用lrem命令将该消息从备份表删除。

另一方面,助手(helper)程序可以通过监视备份表,将超过一定处理时限的消息重新放入队列中去(负责处理该消息的消费者可能已经崩溃),这样就不会丢失任何消息了。

?

17、brpoplpush

brpoplpushsource destination timeout

brpoplpush是rpoplpush的阻塞版本,当给定列表source不为空时,brpoplpush的表现和rpoplpush一样。

当列表source为空时,brpoplpush命令将阻塞连接,直到等待超时,或有另一个客户端对source执行lpush或rpush命令为止。

超时参数timeout接受一个以秒为单位的数字作为值。超时参数设为0表示阻塞时间可以无限期延长(block indefinitely) 。

更多相关信息,请参考rpoplpush命令。

时间复杂度:

O(1)

返回值:

假如在指定时间内没有任

首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据库资源消耗高时两条简单管用.. 下一篇centos6.5下postgres-XC集群安装..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: