Redis---B站学习---redis数据类型List

Redis—B站学习—redis数据类型List

一、List是单值多Value

二、案例

  1. lpush:将一个或多个值 value 插入到列表 key 的表头,返回值是:执行 LPUSH 命令后,列表的长度。

    # 加入单个元素
    
    redis> LPUSH languages python
    (integer) 1
    
    # 加入重复元素
    
    redis> LPUSH languages python
    (integer) 2
    
    redis> LRANGE languages 0 -1     # 列表允许重复元素
    1) "python"
    2) "python"
    
    # 加入多个元素
    
    redis> LPUSH mylist a b c
    (integer) 3
    
    redis> LRANGE mylist 0 -1
    1) "c"
    2) "b"
    3) "a"
    
  2. rpush:将一个或多个值 value 插入到列表 key 的表尾(最右边)。返回值是执行 RPUSH 操作后,表的长度。

    # 添加单个元素
    
    redis> RPUSH languages c
    (integer) 1
    
    
    # 添加重复元素
    
    redis> RPUSH languages c
    (integer) 2
    
    redis> LRANGE languages 0 -1 # 列表允许重复元素
    1) "c"
    2) "c"
    
    
    # 添加多个元素
    
    redis> RPUSH mylist a b c
    (integer) 3
    
    redis> LRANGE mylist 0 -1
    1) "a"
    2) "b"
    3) "c"
    
  3. lrange:返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。返回值是一个列表,包含指定区间内的元素。

    redis> RPUSH fp-language lisp
    (integer) 1
    
    redis> LRANGE fp-language 0 0
    1) "lisp"
    
    redis> RPUSH fp-language scheme
    (integer) 2
    
    redis> LRANGE fp-language 0 1
    1) "lisp"
    2) "scheme"
    
  4. lpop:移除并返回列表 key 的头元素。返回值是列表的头元素。 当 key 不存在时,返回 nil 。

    redis> LLEN course
    (integer) 0
    
    redis> RPUSH course algorithm001
    (integer) 1
    
    redis> RPUSH course c++101
    (integer) 2
    
    redis> LPOP course  # 移除头元素
    "algorithm001"
    
  5. rpop:移除并返回列表 key 的尾元素。返回值是列表的尾元素。 当 key 不存在时,返回 nil 。

    redis> RPUSH mylist "one"
    (integer) 1
    
    redis> RPUSH mylist "two"
    (integer) 2
    
    redis> RPUSH mylist "three"
    (integer) 3
    
    redis> RPOP mylist           # 返回被弹出的元素
    "three"
    
    redis> LRANGE mylist 0 -1    # 列表剩下的元素
    1) "one"
    2) "two"
    
  6. lindex,按照索引下标获得元素(从上到下):返回列表 key 中,下标为 index 的元素。返回值是列表中下标为 index 的元素。 如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。

    redis> LPUSH mylist "World"
    (integer) 1
    
    redis> LPUSH mylist "Hello"
    (integer) 2
    
    redis> LINDEX mylist 0
    "Hello"
    
    redis> LINDEX mylist -1
    "World"
    
    redis> LINDEX mylist 3        # index不在 mylist 的区间范围内
    (nil)
    
  7. llen:返回列表 key 的长度。返回值是列表 key 的长度。

    # 空列表
    
    redis> LLEN job
    (integer) 0
    
    # 非空列表
    
    redis> LPUSH job "cook food"
    (integer) 1
    
    redis> LPUSH job "have lunch"
    (integer) 2
    
    redis> LLEN job
    (integer) 2
    
  8. lrem key 删N个value:根据参数 count 的值,移除列表中与参数 value 相等的元素。返回值是被移除元素的数量。 因为不存在的 key 被视作空表(empty list),所以当 key 不存在时, LREM 命令总是返回 0 。
    注:

    1. count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
    2. count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
    3. count = 0 : 移除表中所有与 value 相等的值。
      # 先创建一个表,内容排列是
      # morning hello morning helllo morning
      
      redis> LPUSH greet "morning"
      (integer) 1
      redis> LPUSH greet "hello"
      (integer) 2
      redis> LPUSH greet "morning"
      (integer) 3
      redis> LPUSH greet "hello"
      (integer) 4
      redis> LPUSH greet "morning"
      (integer) 5
      
      redis> 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) 3
      
      redis> LRANGE greet 0 2
      1) "hello"
      2) "hello"
      3) "morning"
      
      redis> LREM greet -1 morning    # 移除从表尾到表头,第一个 morning
      (integer) 1
      
      redis> LLEN greet               # 剩下两个元素
      (integer) 2
      
      redis> LRANGE greet 0 1
      1) "hello"
      2) "hello"
      
      redis> LREM greet 0 hello      # 移除表中所有 hello
      (integer) 2                    # 两个 hello 被移除
      
      redis> LLEN greet
      (integer) 0
      
  9. ltrim key 开始index 结束index,截取指定范围的值后再赋值给key:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。返回值是命令执行成功时,返回 ok 。
    注:

    1. 以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
    2. 以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
      # 情况 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 的元素
      OK
      
      redis> LRANGE alpha 0 -1       # "h" 被删除了
      1) "e"
      2) "l"
      3) "l"
      4) "o"
      
      
      # 情况 2: stop 比列表的最大下标还要大
      
      
      redis> LTRIM alpha 1 10086     # 保留 alpha 列表索引 1 至索引 10086 上的元素
      OK
      
      redis> LRANGE alpha 0 -1       # 只有索引 0 上的元素 "e" 被删除了,其他元素还在
      1) "l"
      2) "l"
      3) "o"
      
      
      # 情况 3: start 和 stop 都比列表的最大下标要大,并且 start < stop
      
      redis> LTRIM alpha 10086 123321
      OK
      
      redis> LRANGE alpha 0 -1        # 列表被清空
      (empty list or set)
      
      
      # 情况 4: start 和 stop 都比列表的最大下标要大,并且 start > stop
      
      redis> RPUSH new-alpha "h" "e" "l" "l" "o"     # 重新建立一个新列表
      (integer) 5
      
      redis> LRANGE new-alpha 0 -1
      1) "h"
      2) "e"
      3) "l"
      4) "l"
      5) "o"
      
      redis> LTRIM new-alpha 123321 10086    # 执行 LTRIM
      OK
      
      redis> LRANGE new-alpha 0 -1           # 同样被清空
      (empty list or set)
      
  10. rpoplpush 源列表 目的列表
    命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:

    1. 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
    2. 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
      # source 和 destination 不同
      
      redis> LRANGE alpha 0 -1         # 查看所有元素
      1) "a"
      2) "b"
      3) "c"
      4) "d"
      
      redis> RPOPLPUSH alpha reciver   # 执行一次 RPOPLPUSH 看看
      "d"
      
      redis> LRANGE alpha 0 -1
      1) "a"
      2) "b"
      3) "c"
      
      redis> LRANGE reciver 0 -1
      1) "d"
      
      redis> RPOPLPUSH alpha reciver   # 再执行一次,证实 RPOP 和 LPUSH 的位置正确
      "c"
      
      redis> LRANGE alpha 0 -1
      1) "a"
      2) "b"
      
      redis> LRANGE reciver 0 -1
      1) "c"
      2) "d"
      
      
      # source 和 destination 相同
      
      redis> LRANGE number 0 -1
      1) "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"
      
  11. lset key index value:将列表 key 下标为 index 的元素的值设置为 value 。返回值是操作成功返回 ok ,否则返回错误信息。

    # 对空列表(key 不存在)进行 LSET
    
    redis> EXISTS list
    (integer) 0
    
    redis> LSET list 0 item
    (error) ERR no such key
    
    
    # 对非空列表进行 LSET
    
    redis> LPUSH job "cook food"
    (integer) 1
    
    redis> LRANGE job 0 0
    1) "cook food"
    
    redis> LSET job 0 "play game"
    OK
    
    redis> LRANGE job  0 0
    1) "play game"
    
    
    # index 超出范围
    
    redis> LLEN list                    # 列表长度为 1
    (integer) 1
    
    redis> LSET list 3 'out of range'
    (error) ERR index out of range
    
  12. LINSERT key BEFORE|AFTER pivot value:将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。返回值是如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到 pivot ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。

    redis> RPUSH mylist "Hello"
    (integer) 1
    
    redis> RPUSH mylist "World"
    (integer) 2
    
    redis> LINSERT mylist BEFORE "World" "There"
    (integer) 3
    
    redis> LRANGE mylist 0 -1
    1) "Hello"
    2) "There"
    3) "World"
    
    
    # 对一个非空列表插入,查找一个不存在的 pivot
    
    redis> LINSERT mylist BEFORE "go" "let's"
    (integer) -1                                    # 失败
    
    
    # 对一个空列表执行 LINSERT 命令
    
    redis> EXISTS fake_list
    (integer) 0
    
    redis> LINSERT fake_list BEFORE "nono" "gogogog"
    (integer) 0   
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值