美文网首页Redis
Redis 数据结构之 list

Redis 数据结构之 list

作者: 小小小码农 | 来源:发表于2016-05-28 15:00 被阅读289次

    前言

    Redis作为cache服务器,支持多种数据结构,String、List、Hash、Set、Zset。多种数据结构的存在,使得Redis适用于多种业务,Redis的适用也越发广泛,本文就介绍Redis中最简单的数据结构List的操作命令。


    简介

    List顾名思义,即链表、队列。即一个key对应的value为一个队列,支持头插、尾插等操作。


    命令简介

    [LR]PUSH 命令

    语法: [LR]PUSH key value1 [value2 ...]
    作用: 以头插或尾插方式插入指定key队列中一个或多个元素
    返回: 成功返回插入后的队列中元素个数

    头插法插入N个元素

    127.0.0.1:6379> LPUSH list val1 val2 val3
    (integer) 3

    尾插法插入N个元素

    127.0.0.1:6379> RPUSH list val1 val2 val3
    (integer) 6

    List中的所有元素

    127.0.0.1:6379> LRANGE list 0 -1

    1. "val3"
    2. "val2"
    3. "val1"
    4. "val1"
    5. "val2"
    6. "val3"

    [LR]PUSHX 命令

    语法: [LR]PUSHX key value
    作用: 以头插或尾插方式插入指定key队列中一个或多个元素
    返回: 当指定的队列不存在时,返回0,否则插入成功返回插入后队列中的元素个数

    向一个不存在的队列中以头插法插入一个节点

    127.0.0.1:6379> LPUSHX list value
    (integer) 0

    向一个存在的队列中以头插法插入一个节点

    127.0.0.1:6379> LRANGE list 0 -1

    1. "value"
      127.0.0.1:6379> LPUSHX list value
      (integer) 2

    尾插法命令使用方式与头插法类似,此处不做过多介绍


    LINSERT 命令

    语法: LINSERT key where refVal value
    作用: 在已存在的队列key中指定的节点refval位置的前或后插入节点valuewhereafter时在指定节点后插入,before为在指定节点前插入
    返回: 队列不存在则返回0;如果指定节点refVal不存在,则不做任何操作并返回-1,否则按照指定位置插入新元素,并返回插入后节点个数

    向一个不存在的队列中插入元素

    127.0.0.1:6379> LINSERT list after value value1
    (integer) 0

    向一个已经存在的队列中,指定一个不存在节点位置插入

    127.0.0.1:6379> LRANGE list 0 -1

    1. "value"
    2. "value"
      127.0.0.1:6379> LINSERT list after value1 value11
      (integer) -1

    向一个已经存在的队列中,指定一个存在的节点位置后插入新元素

    127.0.0.1:6379> LINSERT list after value value11
    (integer) 3
    127.0.0.1:6379> LRANGE list 0 -1

    1. "value"
    2. "value11"
    3. "value"

    向一个已经存在的队列中,指定一个存在的节点位置前插入新元素

    127.0.0.1:6379> LINSERT list before value value11
    (integer) 4
    127.0.0.1:6379> LRANGE list 0 -1

    1. "value11"
    2. "value"
    3. "value11"
    4. "value"

    注意:当指定的节点在队列中存在多个时,队列按照从头到尾的优先级方式进行匹配


    LLEN 命令

    语法: LLEN key
    作用: 返回队列中元素的个数
    返回: 队列不存在返回0,存在则返回队列中元素个数

    127.0.0.1:6379> LLEN listlist
    (integer) 0
    127.0.0.1:6379> LLEN list
    (integer) 4


    LINDEX 命令

    语法: LINDEX key index
    作用: 返回指定队列指定下标index处的元素
    返回: 队列不存在,返回NULL, index大于队列元素个数,也返回NULL,否则返回对应的节点元素。index如果小于0,则下标逆向遍历

    队列不存在的情况

    127.0.0.1:6379> LINDEX list111 1
    (nil)

    指定下标的元素不存在

    127.0.0.1:6379> LINDEX list 100
    (nil)

    获取指定下标的元素

    127.0.0.1:6379> LINDEX list 1
    "value"


    LSET 命令

    语法: LSET key index value
    作用: 设置队列指定下标出的元素为新值value
    返回: 队列不存在或下标越界均返回错误,否则设置成功返货OK

    队列不存在

    127.0.0.1:6379> LSET listlist 2 value
    (error) ERR no such key

    下标越界

    127.0.0.1:6379> LSET list 100 value
    (error) ERR index out of range

    成功设置

    127.0.0.1:6379> LRANGE list 0 -1

    1. "value11"
    2. "value"
    3. "value11"
    4. "value"
      127.0.0.1:6379> LSET list 0 value123
      OK
      127.0.0.1:6379> LRANGE list 0 -1
    5. "value123"
    6. "value"
    7. "value11"
    8. "value"

    [LR]POP 命令

    语法: [LR]POP key
    作用: 从队列的头或未弹出节点元素(返回该元素并从队列中删除)
    返回: 成功则返回元素,失败则返回NULL

    失败

    127.0.0.1:6379> LPOP listlist
    (nil)
    127.0.0.1:6379> LPOP list
    "value123"
    127.0.0.1:6379> RPOP list
    "value"


    LRANGE 命令

    语法: LRANGE key start end
    作用: 返回队列指定区间的元素, startend可以为负数,逆向遍历
    返回: 成功则返回元素,失败则返回NULL

    队列不存在

    127.0.0.1:6379> LRANGE listlist 0 -1 s
    (empty list or set)

    区间指定错误

    127.0.0.1:6379> LRANGE list 0 -1

    1. "val6"
    2. "val5"
    3. "val4"
    4. "val3"
    5. "val2"
    6. "val1"
      127.0.0.1:6379> LRANGE list 100 200
      (empty list or set)

    获取指定区间的值

    127.0.0.1:6379> LRANGE list 2 4

    1. "val4"
    2. "val3"
    3. "val2"
      127.0.0.1:6379> LRANGE list -4 -2
    4. "val4"
    5. "val3"
    6. "val2"

    获取整个队列的值

    127.0.0.1:6379> LRANGE list 0 -1

    1. "val6"
    2. "val5"
    3. "val4"
    4. "val3"
    5. "val2"
    6. "val1"

    LTRIM 命令

    语法: LTRIM key start end
    作用: 截取队列指定区间的元素,其余元素都删除
    返回: 成功则返回OK

    测试链表元素值

    127.0.0.1:6379> LRANGE list 0 -1

    1. "val6"
    2. "val5"
    3. "val4"
    4. "val3"
    5. "val2"
    6. "val1"

    截取指定区间的值

    127.0.0.1:6379> LTRIM list 2 4
    OK
    127.0.0.1:6379> LRANGE list 0 -1

    1. "val4"
    2. "val3"
    3. "val2"

    区间值错误

    127.0.0.1:6379> LTRIM list -1 0
    OK
    127.0.0.1:6379> LRANGE list 0 -1
    (empty list or set)

    区间值错误,导致整个链表为空


    LREM 命令

    语法: LTRIM key toremove value
    作用: 删除队列中指定值的节点,删除方式由toremove决定, toremove大于0则从头遍历删除,最多删除toremove个节点;
    toremove小于0则从尾遍历删除,最多删除toremove个节点;
    0则删除所有值相同的节点
    返回: 返回删除的节点个数

    从头删除指定值为val的节点

    127.0.0.1:6379> LRANGE list 0 -1

    1. "val"
    2. "val1"
    3. "val"
    4. "val2"
    5. "val"
    6. "val3"
    7. "val"
    8. "val4"
    9. "val"
    10. "val5"
      127.0.0.1:6379> LREM list 3 val
      (integer) 3
      127.0.0.1:6379> LRANGE list 0 -1
    11. "val1"
    12. "val2"
    13. "val3"
    14. "val"
    15. "val4"
    16. "val"
    17. "val5"

    队列中值为val的节点数大于需要删除的数,值删除指定数量的节点,如果队列中节点数量不足呢?

    127.0.0.1:6379> LREM list 3 val
    (integer) 2

    127.0.0.1:6379> LRANGE list 0 -1

    1. "val1"
    2. "val2"
    3. "val3"
    4. "val4"
    5. "val5"

    toremove小于0的情况与大于0的情况类似,不做介绍,下面简单介绍下为0的情况

    127.0.0.1:6379> LRANGE list 0 -1

    1. "val"
    2. "val1"
    3. "val"
    4. "val2"
    5. "val"
    6. "val3"
    7. "val"
    8. "val4"
    9. "val"
    10. "val5"
      127.0.0.1:6379> LREM list 0 val
      (integer) 5
      127.0.0.1:6379> LRANGE list 0 -1
    11. "val1"
    12. "val2"
    13. "val3"
    14. "val4"
    15. "val5"

    RPOPLPUSH 命令

    语法: RPOPLPUSH srcKey dstKey
    作用: 将源队列src的尾部元素插入dst队列的头部
    返回: 成功返回插入的元素

    源队列

    127.0.0.1:6379> LRANGE src 0 -1

    1. "val1"
    2. "val2"
    3. "val3"

    目标队列(可以不存在的,如果不存在则会创建一个新的)

    127.0.0.1:6379> LRANGE dst 0 -1
    (empty list or set)

    执行命令

    127.0.0.1:6379> RPOPLPUSH src dst
    "val3"
    127.0.0.1:6379> LRANGE src 0 -1

    1. "val1"
    2. "val2"
      127.0.0.1:6379> LRANGE dst 0 -1
    3. "val3"

    B[LR]POP 命令

    语法: B[LR]POP key1 [key2 ...] timeout
    作用: 从一个或多个队列的头或尾部弹出一个元素,如果指定的队列集合中有一个队列有元素则立即返回数据,否则阻塞等待timeout时间,如果在指定时间内,队列集合中有元素新增,则该操作返回。否则超时时间到,自动返回
    返回: 成功返回元素以及元素所属队列,失败返回错误

    队列集合中有元素

    127.0.0.1:6379> BLPOP src dst 30

    1. "src"
    2. "val1"

    队列集合中没有元素且超时

    127.0.0.1:6379> BLPOP src dst 30
    (nil)
    (30.04s)

    队列集合中没有元素,阻塞过程中队列集合中新增了元素

    127.0.0.1:6379> BLPOP src dst 300

    1. "src"
    2. "kkk"
      (6.67s)
      新增元素操作

    127.0.0.1:6379> rpush src kkk
    (integer) 1

    阻塞的队列尾部操作类似,不做介绍


    BRPOPLPUSH 命令

    语法: BRPOPLPUSH src dst timeout
    作用: 将指定队列src尾部的元素插入到dst头部,如果队列src为空,则操作阻塞timeout时间,在阻塞时间内,如果队列src有新增元素,则将src队列尾部元素插入到dst头部并返回,否则超时返回
    返回: 返回操作的元素

    源队列不为空

    127.0.0.1:6379> BRPOPLPUSH src dst 300
    "kkkk"

    源队列为空

    127.0.0.1:6379> BRPOPLPUSH src dst 300
    "jjj"
    (11.68s)

    新增操作

    127.0.0.1:6379> rpush src jjj
    (integer) 1


    总结

    List是用得比较多的数据结构之一,使用list可以轻易的构造队列,比如存储消息队列之类的,以完成FIFOFILO的功能。

    相关文章

      网友评论

        本文标题:Redis 数据结构之 list

        本文链接:https://www.haomeiwen.com/subject/mbifdttx.html