Redis-List

来源:互联网 发布:企鹅聊天软件 编辑:程序博客网 时间:2024/06/05 22:56

列表类型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)的,因为就算接收到元素的客户端失败,元素还是保存在列表里面,不会丢失,等到下个迭代来临的时候,别的客户端又可以继续处理这些元素了。



BLPOP

BRPOP

BRPOPLPUSH







0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 锦明8代声音太大怎么办 手机网页无法加载插件怎么办 微信公众号被投诉怎么办 住了酒店的尾房怎么办 喜欢前任的闺蜜怎么办 闺蜜给介绍对象怎么办 喜欢对象的发小怎么办 山东省直医保卡丢失怎么办 高铁票如果错过了怎么办 动车错过了时间怎么办 长途动车错过了怎么办 动车如果错过了怎么办 没有取票错过了怎么办 动车出站没检票怎么办 火车晚点耽误了下班车怎么办 动车票中途丢了怎么办 购买二手房异地铁路公积金怎么办 沈阳公积金卡丢了怎么办 住宅专项维修资金用完了怎么办 广州出租车丢了东西怎么办 广州的士丢了东西怎么办 网上找兼职被骗了怎么办 海信空调开不了机怎么办 海信空调遥控器开不了怎么办 学生遭套路贷反被仲裁怎么办 赏脸打错字尝脸怎么办 红掌的花变黑了怎么办 红掌花苞发黑了怎么办 水培植物腐根了怎么办 水培绿萝水发臭怎么办 水里养花根烂掉怎么办 桅子花叶子发黑怎么办 大株月季烂根怎么办 月季水浇多了烂根的怎么办 金桔盆栽烂根怎么办 盆栽的长寿果树烂根怎么办 家里的石榴烂根怎么办 山桔盆栽烂根怎么办 养的植物烂根怎么办 桅子花叶子长霉怎么办 紫薇花叶子干了怎么办