Redis学习与实战之列表

作者: 西瓜很甜哟 | 来源:发表于2018-06-21 21:31 被阅读46次

    列表是一种可以记录重复字符串值、有序排列的数据存储结构。主要适用于无需次序调整的业务数据记录和读取的场景。如记录用户在网页浏览过程中的网页信息、记录商品评论信息、记录任务队列等。

    1.基本列表操作命令

    命令名称 功能描述 执行时间复杂度
    LPush 从列表左边插入一个或多个元素值 O(1)
    LRange 获取指定范围内列表的元素值 O(S+N)
    RPush 从列表右边插入一个或多个元素值 O(1)
    LPop 从列表左边读出并移除一个元素值 O(1)
    RPop 从列表右边读出并移除一个元素值 O(N)
    LRem 从列表中删除指定元素 O(N)
    LIndex 通过指定列表下标,获取一个元素值 O(1)
    LLen 获取指定列表的元素个数 O(1)
    LSet 设置列表指定位置的元素值 O(N)
    LTrim 对指定列表范围的元素进行修改 O(N)

    ①LPush命令
    语法:LPush key value [value ...]
    参数说明:key是指定的列表名;value是要插入列表左边的元素,一个可以插入多个。如果key不存在,则在插入之前会先创建一个空列表。
    返回值:返回插入操作后的列表的长度。如果key对应的不是列表,则返回错误信息。
    例:

    >LPush newlist  "one"    //先创建一个空列表,再从左边插入第一个元素"one"
    >(integer) 1
    >LPush newlist "two" "three"
    >(integer) 3
    

    ②LRange命令
    语法:LRange key start stop
    参数说明:key是指定的列表名;start是列表元素的读取开始位置;end是列表元素的读取结束位置。如果stop大于列表范围时,默认为列表最大下标的那个元素位置。列表的第一个元素下标是0,以此类推。允许以负数形式倒着对列表下表进行标注。例如start=-1,表示从最后一个元素开始。
    返回值:返回指定范围内的元素值。如果start大于列表范围,则返回空列表。
    例:

    >LRange newlist 0 -1   //0表示列表的第一个元素位置,-1表示列表最后一个元素位置
    1)"three"
    2)"two"
    3)"one"
    >LRange newlist -1 -2  //获取列表右边第一个、第二个元素值
    1)"one"
    2)"two"
    >LRange newlist 0 0  //获取列表左边第一个元素值
    1)"three"
    >LRange newlist 3 5    //开始值大于newlist最大范围
    (empty list or set)      //返回空列表提示
    

    ③RPush命令
    语法:RPush key value [value ...]
    参数说明:key指定的列表名;value是需要从右边插入的值,可以插入多个。如果key不存在,则先创建空列表,然后再从列表右边插入。
    返回值:返回插入列表后的列表长度。如果key对应的不是列表,则返回错误信息。
    例:

    >RPush newrank 1 2 3   
    >(integer) 3
    >LRange 0 -1
    1)"1"
    2)"2"
    3)"3"
    

    ④LPop命令
    语法:LPop key
    参数说明:key是列表名
    返回值:返回列表左边第一个元素值,并从列表中移除该元素值;当key不存在时,返回nil
    例:

    >LPOP newrank
    "1"
    >LPOP newrank 0 -1
    1)"2"
    2)"3"
    >LRange newrank 0 -1
    (empty list or set)
    

    ⑤RPop命令
    语法:RPop key
    返回值:返回列表右边第一个元素值,并从列表中移除该元素值;当key不存在时,返回nil
    例:

    >RPUSH test a b c
    (integer)3
    >RPOP test
    "c"
    >LRange test 0 -1
    1)"a"
    2)"b"
    

    ⑥LRem命令
    语法:LRem key count value
    参数说明:count为指定列表元素的下表位置,可以用正数,从左往右从0开始数下标;可以为负数,从右往左从-1开始数下标。value是需要删除的值。

    • count>0 从头往尾删除值为value的元素;
    • count<0 从尾往头删除值为value的元素;
    • count=0 删除所有值为value的元素
      返回值:返回被删除元素的个数;当key不存在,返回0
      例:
    >RPush testlist1 q q b c a
    (integer)5
    >LRem testlist1 1 "q"
    (integer) 2
    >LRange testlist1 0 -1
    1)"b"
    2)"c"
    3)"a"
    >RPush testlist2 q q b c a
    (integer)5
    >LRem testlist2 -1 "a"
    (integer)1
    >LRange testlist2 0 -1
    1)"q"
    2)"q"
    3)"b"
    4)"c"
    

    ⑦LIndex命令
    语法:LIndex key index
    参数说明:index为列表指定的下标,可以从开始,也可以从-1开始
    返回值:返回Index下标对应的列表元素值。当index超出列表范围时,返回nil
    例:

    >RPush indextest q w e r
    (integer)4
    >LIndex indextest 0
    "q"
    >LIndex indetest -1
    "r"
    >LIndex indetest 1
    "w"
    >LIndex indextest 4
    (nil)
    

    ⑧LLen命令
    语法:LLen key
    返回值:返回指定列表的长度(元素个数)。当key不存在时,返回0
    例:

    >RPush name "Lee"
    (integer)1
    >LLen name
    (integer)1
    

    ⑨LSet命令
    语法:LSet key index value
    参数说明:key是指定的列表名;index是下标;value是需要设置的值。
    返回值:设置成功,返回OK;index超出范围时,返回错误信息。
    例:

    >RPush age 23 25 27
    (integer)3
    >LSet age -1 28
    OK
    >LRange 0 -1
    1)"23"
    2)"25"
    3)"28"
    

    ⑩LTrim命令
    语法:LTrim key start stop
    参数说明:start是列表指定的开始位置下标;stop是列表指定的结束位置下标。改该命令会保留start和stop范围内列表的元素,而移除其他元素。如果start超过列表尾部或者start>stop,修剪的列表为空列表。stop超过列表尾部时,当作列表的最后一个元素的位置看待。
    返回值:修剪成功返回OK。
    例:

    >RPush trimtest a q w x z
    (integer)5
    >LTrim trimtest 1 3
    OK
    >LRange 0 -1
    1)"q"
    2)"w"
    3)"x"
    

    2.其他列表操作命令

    命令名称 功能描述 执行时间复杂度
    LInsert 在指定位置插入一个新元素 O(N)
    LPushX 只有在列表存在时,从左边插入一个元素 O(1)
    RPopLPush 删除右边第一个元素,并将其追加到另一个列表头部 O(1)
    RPushX 只有在列表存在时,从右边插入一个新元素 O(1)
    BLPop 带阻塞功能的LPop命令 O(1)
    BRPop 带阻塞功能的RPop命令 O(1)
    BRPopLPush 带阻塞功能的RPopLPush命令 O(1)

    ①LInsert命令
    语法:LInsert key before|after pivot value
    参数说明:before|after二选一,before是在指定元素前面插入value,after是在指定元素后面插入value,pivot是列表里存在的指定的一个元素。key不存在时,该命令不执行任何操作。
    返回值:插入成功,返回操作后的列表长度。如果pivot不存在,返回-1;key不存在,则返回错误信息。
    例:

    >RPush testinsert "one" "go" "two"
    (integer)3
    >LInsert testinsert before one zero
    (integer)4
    >LRange testinsert 0 -1
    1)"zero"
    2)"one"
    3)"go"
    4)"two"
    

    ②LPushX命令
    语法:LPushX key value
    参数说明:key是指定的列表名;value是需要插入列表左边的值;key不存在时,不执行。这是和LPush命令唯一的区别。
    返回值:执行成功,返回操作后列表的长度。key不存在,则返回0
    例:

    >LPushX testPushX 12  //testPushX 之前是不存在的
    (integer)0
    >LPush testPushX  12
    (integer)1
    >LPushX testPushX 13
    (integer)2
    >LRange testPushX 0 -1
    1)"13"
    2)"12"
    

    ③RPopLPush命令
    语法:RPopLPush source destination
    参数说明:source destination都是是列表名。该命令是从source列表获取并删除左边最后一个元素,把获取的元素插入destination列表左边第一个位置。
    返回值:返回移动的那个元素。如果source列表不存在,返回nil,而且不会执行操作。
    例:

    >LPush test1 12 13 14
    (integer)2
    >RPopLPush test1 dest 
    "12"
    >LRange test1 0 -1
    1)"14"
    2)"13"
    >LRange dest 0 -1
    1)"12"
    

    使用场景说明:(1)可以使用RPopLPush命令,实现对消息队列的轮询。(2)在source和destination列表存储相同内容的情况下,通过该命令可以实现客户端一个接一个的访问,而不用像LRange需要把列表中所有元素都传递到客户端,再进行值获取操作。
    ④RPushX命令
    语法:RPushX key value
    参数说明:value是要从右边插入的值。
    返回值:返回执行命令后列表的长度。
    例:

    >RPushX newR 1 2 3   //newR列表之前不存在
    (integer)0
    >LRange newR 0 -1
    (empty list or set)
    

    ⑤BLPop命令
    语法:BLPop key[key ...] timeout
    参数说明:key是指定的列表名,可以是多个,。timeout是指定阻塞的最大秒数(整型值);当timeout为0,表示阻塞时间无限制。
    阻塞模式:当BLPop指定的列表没有元素时,则客户端进入阻塞模式,一直到有新的元素值通过LPush或RPush被插入列表时,阻塞解除,然后成对读取列表名和左边第一个元素到客户端,并把该元素从列表中移除。
    返回值:当读取列表没有值时,返回nil,并且timeout过期;反之则返回成对的值(列表名和该列表左边第一个元素值)。
    例:

    >del t1 t2  //确保t1 t2列表为空
    (integer)0
    >RPush t1 a b c
    (integer)3
    >BLPop t1 t2   1   //1是过期时间
    1)”t1"
    2)"a"
    >LRange t1 0 -1
    1)"b"
    2)"c"
    

    说明:(1)利用NLPop读取列表元素到客户端时,当客户端发生故障,该元素将丢失。(2)BLPop配合Push类命令,可以实现类似即时聊天消息传递的效果。当服务器端列表插入新值时,BLPop具有客户端自动获取最新消息数据的能力。

    ⑥BRPop命令
    语法:BRPop key [key ...] timeout
    参数说明:使用方法和BLpop命令一样
    返回值:返回值和BLPop命令,唯一区别是返回的元素是列表右边的最后一个。
    ⑦BRPopLPush命令
    语法:BRPopLPush source destination timeout
    参数说明:source和destination使用同RPopLPush命令一样。timeout使用方法和BLPop一样。
    返回值:移动的元素值。timeout超时,则返回多批量的nil。

    说明:(1)BRPopLPush在把读取的值返回给客户端的同时,会把该值插入destination指定的列表,所以不受客户端操作影响,而产生元素丢失的问题。

    相关文章

      网友评论

        本文标题:Redis学习与实战之列表

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