四Redis 列表键

列表(list)
以有序的方式存储多个可重复的值
一个列表可以包含一个或以上数量的 项(item),每个项按照它们被推入到列表的位置来排列。
每个列表项所处的位置决定了这个项的索引值(index),索引以 0 为开始,从列表的左端到右端依次 递 增,位于列表最左端(表 头)的项的索引为 0 ,
而位于列表最右端(表尾)的 项的索引为 N-1 ,其中N为列表的长度。
一个列表示例, 包含了一些编程语言的名字。

从列表的左端推入值
LPUSH key value [value ...]
将一个或以上数量的 值依次推入到列表的左端,命令返回新值被推入之后,列表目前包含的 项数量。
复杂度为O(N) ,其中N为被推入值的数量,如果只推入一个值,那么命令的复 杂度为 O(1)
192.168.229.130:7003> LPUSH lst "Lua"
(integer) 2
192.168.229.130:7003> LPUSH lst "Lua"
(integer) 3
192.168.229.130:7003> lpush lst "Python"
(integer) 4
192.168.229.130:7003> lpush lst "C"
(integer) 5

 

从列表的左端推入多个值
如果执行 LPUSH 命令时给定了多个值,那么那么各个值将按照给定时的顺序,从左到右地被推入到列表地左端。
值被推入的顺序和参数给定的顺序正好相反
192.168.229.130:7003> LPUSH lst "Lua" "Python" "C"
等价于
LPUSH lst "Lua"
LPUSH lst "Python"
LPUSH lst "C"
从列表的右端推入值
RPUSH key value [value ...]
将一个或以上数量的 值依次推入到列表的右端,命令返回新 值被推入之后,列表目前包含的项数量
复杂度为 O(N) ,其中 N 为被推入值的数量,如果只推入一个 值,那么命令的复 杂度为 O(1)
192.168.229.130:7003> RPUSH lst "Clojure"
(integer) 9
192.168.229.130:7003> RPUSH lst "Ruby"
(integer) 10
192.168.229.130:7003> RPUSH lst "C"

从列表的右端推入多个值
如果执行 RPUSH 命令时给定了多个值,那么各个值将按照给定时地顺序,从左到右地被推入到列表地右端
值被推入的顺序和参数给定的顺序正好相同
192.168.229.130:7003> RPUSH lst "Clojure" "Ruby" "
从列表的两端弹出值

 

LPOP/RPOP示例
192.168.229.130:7003> rpush lst "Clojure" "Ruby" "C" "Python" "Lua"
(integer) 5
192.168.229.130:7003> LPOP lst
"Clojure"
192.168.229.130:7003> 
192.168.229.130:7003> LPOP lst
"Ruby"
192.168.229.130:7003> RPOP lst
"Lua"
192.168.229.130:7003> RPOP lst
获取列表的长度
LLEN key
返回列表键 key 的长度,也即是,返回列表包含的列表 项数量。
因为 Redis 会记录每个列表的长度,所以这个命令无须遍历列表,它的复杂度为 O(1)
192.168.229.130:7003> RPUSH lst "Clojure" "Ruby" "C" "Python" "Lua"
(integer) 5
192.168.229.130:7003> LLEN lst
(integer) 5
192.168.229.130:7003> LPOP lst
"Clojure"
192.168.229.130:7003> LLEN lst
(integer) 4
192.168.229.130:7003> 
返回给定索引上的项
LINDEX key index
返回列表键 key 中,指定索引 index 上的列表项。index 索引可以是正数或者负数
复杂度为 O(N) ,N列表的长度
192.168.229.130:7003> lrange lst 0 100
1) "Clojure"
2) "Ruby"
3) "C"
4) "Python"
5) "Lua"
192.168.229.130:7003> LINDEX lst 1
"Ruby"
192.168.229.130:7003> LINDEX lst 4
"Lua"
192.168.229.130:7003> LINDEX lst -3
"C"
返回给定索引范围之内的所有项
LRANGE key start stop
返回列表键 key 中,从索引 start 至索引 stop 范围内的所有列表项。两个索引参数都可以是正数或者 负数。
复杂度为 O(N) , N 为被返回的列表项数量
192.168.229.130:7003> lrange lst 0 100
1) "Clojure"
2) "Ruby"
3) "C"
4) "Python"
5) "Lua"
192.168.229.130:7003> lrange lst 0 2
1) "Clojure"
2) "Ruby"
3) "C"
192.168.229.130:7003> lrange lst -3 -1
1) "C"
2) "Python"
3) "Lua"
192.168.229.130:7003> 
设置在指定位置插入列表项
LINSERT key BEFORE|AFTER pivot value
根据命令调用时传递的是 BEFORE 选项还是 AFTER 选项,将值 value 插入到指定列表项 pivot 的之前 或者之后。当 pivot 不存在于列表 key 时,不执行任何操作。
返回 -1 表示 pivot 不存在;返回 0 表示键 key 不存在;插入成功 时则返回列表当前的 长度。 复杂度为 O(N) ,N 为列表长度
192.168.229.130:7003> lrange lst 0 100
1) "Common Lisp"
2) "Ruby"
3) "C"
4) "Python"
5) "Lua"
192.168.229.130:7003> linsert lst before "C" "Ruby"
(integer) 6
192.168.229.130:7003> lrange lst 0 100
1) "Common Lisp"
2) "Ruby"
3) "Ruby"
4) "C"
5) "Python"
6) "Lua"
插入和删除操作
LSET、LINSERT、LREM、LTRIM

设置指定索引上的列表项
LSET key index value
将列表键 key 索引 index 上的列表项设置为value ,设置成功时命令返回 OK 。 如果 index 参数超过了列表的索引范 围,那么命令返回一个 错误。针对表头和表尾节点进行处理时(index 为 0 或者 -1),命令的复杂度为 O(1) ;其他情况下,命令的复 杂度为 O(N) ,N 为列表的长度
从列表中删除指定的值
LREM key count value
根据参数 count 的值,移除列表中与参数 value 相等的列表项:
• 如果 count > 0 ,那么从表头开始向表尾搜索,移除最多 count 个值为 value 的列表项。
• 如果 count < 0 ,那么从表尾开始向表 头搜索,移除最多 abs(count) 个值为 value 的列表项。
• 如果 count = 0 ,那么移除列表中所有 值为 value 的列表项。
命令返回被移除列表 项的数量。 命令的复杂度为 O(N) ,N 为列表的长度。
192.168.229.130:7003> RPUSH lst "app" "zoo" "spam" "app" "zoo" "egg" "app"
(integer) 7
192.168.229.130:7003> lrem lst 0 "zoo"
(integer) 2
192.168.229.130:7003> lrem lst 1 "app"
(integer) 1
192.168.229.130:7003> lrem lst -1 "app"
(integer) 1
192.168.229.130:7003> lrange lst 0 100
1) "spam"
2) "app"
3) "egg"
192.168.229.130:7003> 
修剪列表
LTRIM key start stop
对一个列表进行修剪(trim),让列表只保留指定索引范 围内的列表项,而将不在范围内的其他列表项全部
删除。两个索引都可以是正数或者 负数。
命令执行成功时返回 OK ,复杂度为 O(N) ,N 为被移除列表项的数量
192.168.229.130:7003> lrange lst 0 100
1) "spam"
2) "app"
3) "egg"
4) "a"
5) "b"
6) "C"
192.168.229.130:7003> LTRIM lst 0 2
OK
192.168.229.130:7003> lrange lst 0 100
1) "spam"
2) "app"
3) "egg"
192.168.229.130:7003> 

 

阻塞式弹出操作(LPOP 和 BRPOP)
阻塞弹出命令

 

LPOP/BRPOP 的先到先服务原则
如果有多个客户端同时因为某个列表而被阻塞,那么当有新 值被推入到这个列表时,服务器会按照先到
先服务(first in first service)原则,优先向最早被阻塞的客 户端返回新值。
举个例子,假设列表 lst 为空,那么当客户端 X 执行命令 BLPOP lst timeout 时,客户端 X 将被阻塞。
在此之后,客户端 Y 也执行命令 BLPOP lst timeout ,也因此被阻塞
如果这时,客户端 Z 执行命令 RPUSH lst "hello" ,将值 "hello" 推入列表 lst ,那么这个 "hello" 将被返回
给客户端 X ,而不是客户端 Y ,因为客户端 X 的被阻塞时间要早于客户端 Y 的被阻塞时间。




真实世界的消息队列
消息队列不一定要自己制?,因 为已经有很多使用 Redis 列表作为后端的消息队列项目,并且它们的
可用性和稳定性都经过了一定时间的考验,所以我们可以考虑使用这些现成的消息队列:
Python RQ http://python-rq.org/
Resque https://github.com/resque/resque
Celery http://www.celeryproject.org/


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值