设为首页 加入收藏

TOP

小贝_redislist类型学习(二)
2015-11-21 01:41:17 来源: 作者: 【 】 浏览:5
Tags:小贝 _redislist 类型 学习
令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被rlpop命令阻塞,直到等待超时或发现可弹出元素为止。

当给定多个key参数时,按参数key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。

非阻塞行为

当rlpop被调用时,如果给定key内至少有一个非空列表,那么弹出遇到的第一个非空列表的头元素,并和被弹出元素所属的列表的名字一起,组成结果返回给调用者。

当存在多个给定key时,rlpop按给定key参数排列的先后顺序,依次检查各个列表。

假设现在有job、 command和request三个列表,其中job不存在,command和request都持有非空列表。考虑以下命令:

rlpopjob command request 0

rlpop保证返回的元素来自command,因为它是按”查找job -> 查找command -> 查找request“这样的顺序,第一个找到的非空列表。

?

127.0.0.1:6379>DEL job command request # 确保key都被删除

(integer)0

127.0.0.1:6379>lpush command "update system..." # 为command列表增加一个值

(integer)1

127.0.0.1:6379>lpush request "visit page" # 为request列表增加一个值

(integer)1

127.0.0.1:6379>rlpop job command request 0 # job列表为空,被跳过,紧接着command列表的第一个元素被弹出。

1)"command" # 弹出元素所属的列表

2)"update system..." # 弹出元素所属的值阻塞行为

如果所有给定key都不存在或包含空列表,那么rlpop命令将阻塞连接,直到等待超时,或有另一个客户端对给定key的任意一个执行lpush或rpush命令为止。

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

127.0.0.1:6379>EXISTS job # 确保两个key都不存在

(integer)0

127.0.0.1:6379>EXISTS command

(integer)0

127.0.0.1:6379>rlpop job command 300 #因为key一开始不存在,所以操作会被阻塞,直到另一客户端对job或者command列表进行PUSH操作。

1)"job" # 这里被push的是job

2)"do my home work" # 被弹出的值

(26.26s) # 等待的秒数

127.0.0.1:6379>rlpop job command 5 # 等待超时的情况

(nil)

(5.66s)# 等待的秒数相同的key被多个客户端同时阻塞

相同的key可以被多个客户端同时阻塞。

不同的客户端被放进一个队列中,按”先阻塞先服务”(first-rlpop,first-served)的顺序为key执行rlpop命令。

在MULTI/EXEC事务中的rlpop

rlpop可以用于流水线(pipline,批量地发送多个命令并读入多个回复),但把它用在MULTI/EXEC块当中没有意义。因为这要求整个服务器被阻塞以保证块执行时的原子性,该行为阻止了其他客户端执行lpush或rpush命令。

一个被包含在MULTI/EXEC块内的rlpop操作,行为表现得就像操作超时一样,仅仅返回一个nil值。

如果你是科幻迷,你可以想象在MULTI/EXEC块内,时间以无限的速度在流逝。

127.0.0.1:6379>MULTI

OK

127.0.0.1:6379>rlpop job 30

QUEUED

127.0.0.1:6379>EXEC

1)(nil) # 操作没有等待,立即被返回了时间复杂度:

O(1)

返回值:

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

反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。

?

8、brpop

brpopkey [key ...] timeout

brpop是列表的阻塞式(blocking)弹出原语。

它是rpop命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被brpop命令阻塞,直到等待超时或发现可弹出元素为止。

当给定多个key参数时,按参数key的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素。

关于阻塞操作的更多信息,请查看rlpop命令,brpop除了弹出元素的位置和rlpop不同之外,其他表现一致。

时间复杂度:

O(1)

返回值:

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

反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。

127.0.0.1:6379>llen course

(integer)0

127.0.0.1:6379>rpush course algorithm001

(integer)1

127.0.0.1:6379>rpush course c++101 # 尾部元素

(integer)2

127.0.0.1:6379>brpop course 30

1)"course" # 弹出元素的key

2)"c++101" # 弹出元素的值

?

9、llen

llenkey

返回列表key的长度。

如果key不存在,则key被解释为一个空列表,返回0.

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

时间复杂度:

O(1)

返回值:

列表key的长度。

#情况1:空列表

127.0.0.1:6379>llen job

(integer)0

#情况2:非空列表

127.0.0.1:6379>lpush job "cook food"

(integer)1

127.0.0.1:6379>lpush job "have lunch"

(integer)2

127.0.0.1:6379>llen job

(integer)2

?

10、lrange

lrangekey start stop

返回列表key中指定区间内的元素,区间以偏移量start和stop指定。

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

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

注意lrange命令和编程语言区间函数的区别

假如你有一个包含一百个元素的列表,对该列表执行lrange list 0 10,结果是一个包含11个元素的列表,这表明stop下标也在lrange命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的Range.new、Array#slice和Python的range()函数。

超出范围的下标

超出范围的下标值不会引起错误。

如果start下标比列表的最大下标end(llen list减去1)还要大,或者start > stop,lrange返回一个空列表。

如果stop下标比end下标还要大,Redis将stop的值设置为end。

时间复杂度:

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

评论

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