列表(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/