Redis学习笔记系列(四)——基本数据类型之列表

5.2 列表(list)

5.2.1 LPUSH / RPUSH / LPUSHX / RPUSHX / LINSERT
  • LPUSH / RPUSH
    LPUSHRPUSH命令用于将元素插入队列中,并在Redis 2.4以上版本支持一次将一个或多个元素插入队列中。两个命令的区别为LPUSH将新元素插入到队列的队首位置,而RPUSH命令将元素插入到队尾位置。命令执行后将返回插入元素后队列的长度。当键不存在,将创建一个空白的队列并执行插入操作;若键存在但不为队列,将返回错误。
    LPUSH key element [element ...]
    RPUSH key element [element ...]
    当使用LPUSH插入多个元素时,将逐个将元素插入到队首。如插入a、b、c后,队列中的顺序为c、b、a
    当使用RPUSH插入多个元素时,将逐个将元素插入到队尾。如插入a、b、c后,队列中的顺序为a、b、c

  • 示例

# 将a b c 依次插入队首
127.0.0.1:6379> LPUSH list1 a b c
(integer) 3
127.0.0.1:6379> LRANGE list1 0 -1
1) "c"
2) "b"
3) "a"
# 将d e f 依次插入队尾
127.0.0.1:6379> RPUSH list2 d e f
(integer) 3
127.0.0.1:6379> LRANGE list2 0 -1
1) "d"
2) "e"
3) "f"
  • LPUSHX / RPUSHX
    LPUSHX / RPUSHX命令与LPUSH / RPUSH类似,区别为它们仅在键已存在且为列表的情况下才执行插入的操作。当键不存在时,将无操作被执行;当键存在但不为列表类型时将返回错误。
    LPUSHX key element [element ...]
    RPUSHX key element [element ...]
    LPUSHXRPUSHX 命令在执行后,将返回列表的长度。若键不存在则返回0。

  • 示例

# list1 存在,因此插入成功,返回6
127.0.0.1:6379> LPUSHX list1 d e f
(integer) 6
127.0.0.1:6379> LRANGE list1 0 -1
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
# list 不存在,因此插入失败,返回0
127.0.0.1:6379> RPUSHX list d e f
(integer) 0
  • LINSERT
    LINSERT命令用于将元素插入到指定元素pivot之前或之后的位置,并返回插入元素后列表的长度。当元素pivot不存在时,将返回-1。若键不存在将视作其为一个空的列表,不执行任何操作。
    LINSERT key BEFORE|AFTER pivot element

  • 示例

127.0.0.1:6379> LPUSH list a b c
(integer) 3
127.0.0.1:6379> LINSERT list BEFORE a 1
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "c"
2) "b"
3) "1"
4) "a"
5.2.2 LPOP / RPOP / BLPOP / BRPOP
  • LPOP / RPOP
    LPOP命令用于移除并返回队列中的第一个元素,当键不存在时返回nil。当列表中只有一个元素时,执行LPOP命令后键将被删除。RPOP命令与LPOP相似,用于移除并返回列表中的最后一个元素。
    LPOP key
    RPOP key

  • 示例

127.0.0.1:6379> LPUSH list a b c
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> LPOP list
"c"
127.0.0.1:6379> RPOP list
"a"
127.0.0.1:6379> LPOP list
"b"
127.0.0.1:6379> LRANGE list 0 -1
(empty array)
  • BLPOP / BRPOP
    BLPOP命令是阻塞版的LPOP,当给定列表中无元素可被弹出时将阻塞连接,直到超时或有元素可被弹出。与LPOP不同的是,BLPOP可以给定多个键名,并将依次检查各个列表。若给定的键名中存在至少一个为非空列表,执行BLPOP将弹出并返回第一个非空列表中的队首元素。
    BRPOP命令与BLPOP相似,即为阻塞版的RPOP操作,其与BLPOP的区别为存在非空列表时将从队尾弹出元素。
    BLPOP key [key ...] timeout
    BRPOP key [key ...] timeout
    BLPOP/BRPOP参数中的timeout为一个以秒为单位的数值,用于表示阻塞的最长时间。当timeout的值为0时,表示将无限期地阻塞,直到有元素可被弹出。
    BLPOP/BRPOP命令执行后将返回一个数组,其第一个元素为键名,第二个元素为被弹出的元素。当列表直到超时也无元素可被弹出时,返回nil

  • 示例

127.0.0.1:6379> LPUSH list a b c
(integer) 3
127.0.0.1:6379> BLPOP list 1
1) "list"
2) "c"
127.0.0.1:6379> BLPOP list 1
1) "list"
2) "b"
127.0.0.1:6379> BLPOP list 1
1) "list"
2) "a"
127.0.0.1:6379> BLPOP list 1
(nil)
(1.10s)
# 打开一个新的redis-cli,插入元素后,返回
127.0.0.1:6379> BLPOP list 0
1) "list"
2) "c"
(27.70s)
5.2.3 RPOPLPUSH / BRPOPLPUSH
  • RPOPLPUSH
    RPOPLPUSH命令用于将source所指定的列表中队尾位置的元素移除,并插入到destination所指定的列表队首位置。该命令执行后将返回从source中移除并插入到destination中的元素。
    RPOPLPUSH source destination
    source所指定的列表不存在,将返回nil且不执行其它操作。若destination所指定的列表不存在,则将创建一个空队列并执行插入操作。
    sourcedestination相同,执行后的结果将为移除队尾的元素并插入到队首。
  • 示例
127.0.0.1:6379> LPUSH list1 a b c
(integer) 3
127.0.0.1:6379> RPOPLPUSH list1 list2
"a"
127.0.0.1:6379> LRANGE list1 0 -1
1) "c"
2) "b"
127.0.0.1:6379> LRANGE list2 0 -1
1) "a"
127.0.0.1:6379> RPOPLPUSH list1 list1
"b"
127.0.0.1:6379> LRANGE list1 0 -1
1) "b"
2) "c"
  • BRPOPLPUSH
    BRPOPLPUSH命令即阻塞版的RPOPLPUSH命令,当source指定的列表不为空时(列表中存在元素),其行为与RPOPLPUSH命令相同。
    BRPOPLPUSH source destination timeout
    若执行命令时列表不为空,执行操作后返回与RPOPLPUSH命令相同。若等待超时(在timeout时间内无元素可被弹出),则将返回nil及等待的时间。若在等待期间存在元素可被弹出,则在执行操作后返回一个数组,其中包括被弹出元素的值及等待的时间。

  • 示例

127.0.0.1:6379> BRPOPLPUSH list1 list2 5
"c"
127.0.0.1:6379> BRPOPLPUSH list1 list2 5
"b"
127.0.0.1:6379> BRPOPLPUSH list1 list2 5
(nil)
(5.00s)
127.0.0.1:6379> BRPOPLPUSH list1 list2 0
"a"
(4.70s)
5.2.4 LRANGE / LPOS / LINDEX / LLEN
  • LRANGE
    LRANGE命令用于获取列表中由索引值startstop指定的范围内的元素,索引值从0开始(即0为列表中第一个元素),负数值表示相对于列表队尾的位置(如-1代表列表中最后一个元素,-2代表列表中倒数第二个元素)。LRANGE命令返回的元素将包含startstop范围内的所有元素,如使用LRANGE list 0 10将获取到索引为0到10的总共11个元素。
    LRANGE key start stop
    当索引超出列表边界时,将只返回范围内列表存在的元素,而不会返回错误。若偏移start大于队尾的位置,将返回空列表(即无元素);若偏移stop大于队尾的位置,将认为只获取到列表队尾的位置。

  • 示例

127.0.0.1:6379> LPUSH list a b c
(integer) 3
# 从第0个到倒数第1个,即所有元素
127.0.0.1:6379> LRANGE list 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> LRANGE list 0 1000
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> LRANGE list -2 -1
1) "b"
2) "a"
127.0.0.1:6379> LRANGE list -2 0
(empty array)
  • LPOS
    LPOS命令返回列表中符合条件的元素的索引,返回的索引从0开始(即0为列表中的第一个元素。在未指定参数的情况下,默认从列表的队首开始扫描,直到找到符合的元素。
    LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
    LPOS有三个可选参数RANKCOUNT以及MAXLEN

    • RANK 获取第N个符合条件元素;
    • COUNT 获取的元素数量;
    • MAXLEN 只比较给定数量的元素。
  • 示例

127.0.0.1:6379> LPUSH list a b c a d e f
(integer) 7
127.0.0.1:6379> LPOS list a RANK 1
(integer) 3
127.0.0.1:6379> LPOS list a RANK 2
(integer) 6
127.0.0.1:6379> LPOS list a COUNT 2
1) (integer) 3
2) (integer) 6
# 从第2个a开始,输出3个a的位置。
127.0.0.1:6379> LPOS list a RANK 2 COUNT 3
1) (integer) 6
# 获取前7个元素中的3个a的位置列表,只有2个a,因此,返回 3 和 6
127.0.0.1:6379> LPOS list a COUNT 3 MAXLEN 7
1) (integer) 3
2) (integer) 6
# 获取前4个元素中的3个a的位置列表,只有1个a,因此,返回 3
127.0.0.1:6379> LPOS list a COUNT 3 MAXLEN 4
1) (integer) 3
  • LINDEX
    LINDEX命令用于获取列表中指定索引的元素,当索引超出列表范围时返回nil。索引的值从0开始,即0代表列表中的第一个元素,1代表列表中的第二个元素。当索引的值为负数时,表示相对于列表队尾的位置,如-1代表列表中最后一个元素,-2代表列表中倒数第二个元素。
    LINDEX key index

  • 示例

127.0.0.1:6379> LPUSH list a b c
(integer) 3
127.0.0.1:6379> LINDEX list 0
"c"
127.0.0.1:6379> LINDEX list 1
"b"
127.0.0.1:6379> LINDEX list -1
"a"
127.0.0.1:6379> LINDEX list 5
(nil)
  • LLEN
    LLEN命令用于获取列表中存储的元素数量,若键不存在则当作空白的队列(即返回0)。当键存在但类型不为队列时将返回错误。
    LLEN key

  • 示例

127.0.0.1:6379> LPUSH list a b c
(integer) 3
127.0.0.1:6379> LLEN list
(integer) 3
127.0.0.1:6379> LLEN list1
(integer) 0
127.0.0.1:6379> SET k1 v1
OK
127.0.0.1:6379> LLEN k1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
5.2.5 LTRIM
  • LTRIM
    LTRIM命令用于对列表进行修建,即只保留指定范围内的部分元素。指定范围的偏移量startstop都为以0为开始,即索引0为列表中的第一个元素,负数值表示相对于列表队尾的位置(如-1代表列表中最后一个元素)。例如命令LTRIM list 0 4在执行后只保留列表中的前五个元素,其它元素将被删除。
    LTRIM key start stop
    start的值大于列表的长度或start大于stop时,结果将为一个空列表。若stop大于列表的长度,其值将被设置为列表最后一个元素的索引值。
    使用LTRIMLPUSHRPUSH命令配合使用,将达到使列表长度保持在指定大小内的效果。

  • 示例

127.0.0.1:6379> LPUSH list a b c d
(integer) 4
127.0.0.1:6379> LPUSH list e f g
(integer) 7
127.0.0.1:6379> LTRIM list 0 5
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "g"
2) "f"
3) "e"
4) "d"
5) "c"
6) "b"
127.0.0.1:6379> LPUSH list h i j
(integer) 9
127.0.0.1:6379>  LTRIM list 0 5
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "j"
2) "i"
3) "h"
4) "g"
5) "f"
6) "e"
127.0.0.1:6379> LTRIM list 100 10000
OK
127.0.0.1:6379> LRANGE list 0 -1
(empty array)
5.2.6 LSET

*LSET
LSET命令用于设置列表中指定位置的元素,当索引不在列表的范围内时将返回错误。与LINDEX相同,索引从0开始,且负数值代表相对于队尾的位置。
LSET key index element

  • 示例
127.0.0.1:6379> LPUSH list a b c
(integer) 3
127.0.0.1:6379> LSET list 0 d
OK
127.0.0.1:6379> LSET list -1 f
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "d"
2) "b"
3) "f"
5.2.7 LREM
  • LREM
    LREM命令用于移除队列中指定数量与参数element值相同的元素,并返回实际移除的元素数量。若键不存在,则是作为一个空列表,执行后将返回0(即无符合的元素被删除)。
    LREM key count element
    LREM命令执行的操作受到count参数影响,不同的count值执行的操作为:

    • count > 0时,将从队首开始移除对应数量相同的元素;
    • count < 0时,将从队尾开始移除对应数量相同的元素;
    • count = 0,将移除列表中所有相同的元素。
  • 示例

127.0.0.1:6379> LPUSH list a b a a c d e d
(integer) 8
# 移除所有a
127.0.0.1:6379> LREM list 0 a
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "d"
2) "e"
3) "d"
4) "c"
5) "b"
# 从队首开始移除1个d
127.0.0.1:6379> LREM list 1 d
(integer) 1
127.0.0.1:6379> LRANGE list 1 -1
1) "d"
2) "c"
3) "b"

写在最后

如果你觉得我写的文章帮到了你,欢迎点赞、评论、分享、赞赏哦,你们的鼓励是我不断创作的动力~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352