Redis-List

来源:互联网 发布:叮叮办公软件 编辑:程序博客网 时间:2024/05/16 11:46

列表类型list常用操作是向列表两端添加元素。 double-linked-list 

List(列表) L 头 R尾

LPUSH

LPUSH key value [value ...]将一个或多个值 value 插入到列表 key 的表头# 加入单个元素redis> LPUSH languages python(integer) 1# 加入重复元素redis> LPUSH languages python(integer) 2redis> LRANGE languages 0 -1     # 列表允许重复元素1) "python"2) "python"# 加入多个元素redis> LPUSH mylist a b c(integer) 3redis> LRANGE mylist 0 -11) "c"2) "b"3) "a"

RPUSH

RPUSH key value [value ...]将一个或多个值 value 插入到列表 key 的表尾(最右边)。# 添加单个元素redis> RPUSH languages c(integer) 1# 添加重复元素redis> RPUSH languages c(integer) 2redis> LRANGE languages 0 -1 # 列表允许重复元素1) "c"2) "c"# 添加多个元素redis> RPUSH mylist a b c(integer) 3redis> LRANGE mylist 0 -11) "a"2) "b"3) "c"

LPOP

LPOP key移除并返回列表 key 的头元素。redis> LLEN course(integer) 0redis> RPUSH course algorithm001(integer) 1redis> RPUSH course c++101
LLEN key返回列表 key 的长度如果 key 不存在,则 key 被解释为一个空列表,返回 0 .如果 key 不是列表类型,返回一个错误。# 空列表redis> LLEN job(integer) 0# 非空列表redis> LPUSH job "cook food"(integer) 1redis> LPUSH job "have lunch"(integer) 2
redis> LPOP course # 移除头元素"algorithm001"
RPOP

RPOP key移除并返回列表 key 的尾元素。redis> RPUSH mylist "one"(integer) 1redis> RPUSH mylist "two"(integer) 2redis> RPUSH mylist "three"(integer) 3redis> RPOP mylist           # 返回被弹出的元素"three"redis> LRANGE mylist 0 -1    # 列表剩下的元素1) "one"2) "two"
LLEN

LLEN key返回列表 key 的长度如果 key 不存在,则 key 被解释为一个空列表,返回 0 .如果 key 不是列表类型,返回一个错误。# 空列表redis> LLEN job(integer) 0# 非空列表redis> LPUSH job "cook food"(integer) 1redis> LPUSH job "have lunch"(integer) 2redis> LLEN job(integer) 2

LPUSHX

LPUSHX key value将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。和 LPUSH 命令相反,当 key 不存在时, LPUSHX 命令什么也不做# 对空列表执行 LPUSHXredis> LLEN greet                       # greet 是一个空列表(integer) 0redis> LPUSHX greet "hello"             # 尝试 LPUSHX,失败,因为列表为空(integer) 0# 对非空列表执行 LPUSHXredis> LPUSH greet "hello"              # 先用 LPUSH 创建一个有一个元素的列表(integer) 1redis> LPUSHX greet "good morning"      # 这次 LPUSHX 执行成功(integer) 2redis> LRANGE greet 0 -11) "good morning"2) "hello"
RPUSHX

RPUSHX key value将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。和 RPUSH 命令相反,当 key 不存在时, RPUSHX 命令什么也不做。# key不存在redis> LLEN greet(integer) 0redis> RPUSHX greet "hello"     # 对不存在的 key 进行 RPUSHX,PUSH 失败。(integer) 0# key 存在且是一个非空列表redis> RPUSH greet "hi"         # 先用 RPUSH 插入一个元素(integer) 1redis> RPUSHX greet "hello"     # greet 现在是一个列表类型,RPUSHX 操作成功。(integer) 2redis> LRANGE greet 0 -11) "hi"2) "hello"
LRANGE

LRANGE key start stop返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。redis> RPUSH fp-language lisp(integer) 1redis> LRANGE fp-language 0 01) "lisp"redis> RPUSH fp-language scheme(integer) 2redis> LRANGE fp-language 0 11) "lisp"2) "scheme"
LREM

LREM key count value根据参数 count 的值,移除列表中与参数 value 相等的元素。count 的值可以是以下几种:count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值。# 先创建一个表,内容排列是# morning hello morning helllo morningredis> LPUSH greet "morning"(integer) 1redis> LPUSH greet "hello"(integer) 2redis> LPUSH greet "morning"(integer) 3redis> LPUSH greet "hello"(integer) 4redis> LPUSH greet "morning"(integer) 5redis> LRANGE greet 0 4         # 查看所有元素1) "morning"2) "hello"3) "morning"4) "hello"5) "morning"redis> LREM greet 2 morning     # 移除从表头到表尾,最先发现的两个 morning(integer) 2                     # 两个元素被移除redis> LLEN greet               # 还剩 3 个元素(integer) 3redis> LRANGE greet 0 21) "hello"2) "hello"3) "morning"
LSET

LSET key index value将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误# 对空列表(key 不存在)进行 LSETredis> EXISTS list(integer) 0redis> LSET list 0 item(error) ERR no such key# 对非空列表进行 LSETredis> LPUSH job "cook food"(integer) 1redis> LRANGE job 0 01) "cook food"redis> LSET job 0 "play game"OKredis> LRANGE job  0 01) "play game"# index 超出范围redis> LLEN list                    # 列表长度为 1(integer) 1redis> LSET list 3 'out of range'(error) ERR index out of range
LTRIM
LTRIM key start stop对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。# 情况 1: 常见情况, start 和 stop 都在列表的索引范围之内redis> LRANGE alpha 0 -1       # alpha 是一个包含 5 个字符串的列表1) "h"2) "e"3) "l"4) "l"5) "o"redis> LTRIM alpha 1 -1        # 删除 alpha 列表索引为 0 的元素OKredis> LRANGE alpha 0 -1       # "h" 被删除了1) "e"2) "l"3) "l"4) "o"

LINDEX

LINDEX key index返回列表 key 中,下标为 index 的元素。下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。redis> LPUSH mylist "World"(integer) 1redis> LPUSH mylist "Hello"(integer) 2redis> LINDEX mylist 0"Hello"redis> LINDEX mylist -1"World"redis> LINDEX mylist 3        # index不在 mylist 的区间范围内(nil)

LINSERT

LINSERT key BEFORE|AFTER pivot value将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。当 pivot 不存在于列表 key 时,不执行任何操作。当 key 不存在时, key 被视为空列表,不执行任何操作。如果 key 不是列表类型,返回一个错误。redis> RPUSH mylist "Hello"(integer) 1redis> RPUSH mylist "World"(integer) 2redis> LINSERT mylist BEFORE "World" "There"(integer) 3redis> LRANGE mylist 0 -11) "Hello"2) "There"3) "World"
RPOPLPUSH

RPOPLPUSH source 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)操作。redis> LRANGE alpha 0 -1         # 查看所有元素1) "a"2) "b"3) "c"4) "d"redis> RPOPLPUSH alpha reciver   # 执行一次 RPOPLPUSH 看看"d"redis> LRANGE alpha 0 -11) "a"2) "b"3) "c"redis> LRANGE reciver 0 -11) "d"# source 和 destination 相同redis> LRANGE number 0 -11) "1"2) "2"3) "3"4) "4"redis> RPOPLPUSH number number"4"redis> LRANGE number 0 -1           # 4 被旋转到了表头1) "4"2) "1"3) "2"4) "3"redis> RPOPLPUSH number number"3"redis> LRANGE number 0 -1           # 这次是 3 被旋转到了表头1) "3"2) "4"3) "1"4) "2"

模式: 安全的队列Redis的列表经常被用作队列(queue),用于在不同程序之间有序地交换消息(message)。一个客户端通过 LPUSH 命令将消息放入队列中,而另一个客户端通过 RPOP 或者 BRPOP 命令取出队列中等待时间最长的消息。不幸的是,上面的队列方法是『不安全』的,因为在这个过程中,一个客户端可能在取出一个消息之后崩溃,而未处理完的消息也就因此丢失。使用 RPOPLPUSH 命令(或者它的阻塞版本 BRPOPLPUSH )可以解决这个问题:因为它不仅返回一个消息,同时还将这个消息添加到另一个备份列表当中,如果一切正常的话,当一个客户端完成某个消息的处理之后,可以用 LREM 命令将这个消息从备份表删除。最后,还可以添加一个客户端专门用于监视备份表,它自动地将超过一定处理时限的消息重新放入队列中去(负责处理该消息的客户端可能已经崩溃),这样就不会丢失任何消息了。模式:循环列表通过使用相同的 key 作为 RPOPLPUSH 命令的两个参数,客户端可以用一个接一个地获取列表元素的方式,取得列表的所有元素,而不必像 LRANGE 命令那样一下子将所有列表元素都从服务器传送到客户端中(两种方式的总复杂度都是 O(N))。以上的模式甚至在以下的两个情况下也能正常工作:有多个客户端同时对同一个列表进行旋转(rotating),它们获取不同的元素,直到所有元素都被读取完,之后又从头开始。有客户端在向列表尾部(右边)添加新元素。这个模式使得我们可以很容易实现这样一类系统:有 N 个客户端,需要连续不断地对一些元素进行处理,而且处理的过程必须尽可能地快。一个典型的例子就是服务器的监控程序:它们需要在尽可能短的时间内,并行地检查一组网站,确保它们的可访问性。注意,使用这个模式的客户端是易于扩展(scala)且安全(reliable)的,因为就算接收到元素的客户端失败,元素还是保存在列表里面,不会丢失,等到下个迭代来临的时候,别的客户端又可以继续处理这些元素了。BLPOPBRPOPBRPOPLPUSH








0 0