redis_list

list

  • 特点:
    • 1:列表中的元素是有序的,可以通过下标获取某个元素值[下标从0开始
    • 2:列表中的元素是可以重复的

  • 列表的五种操作类型

  • 1:添加操作

    • 从右边插入元素 rpush key value [value ...]

      127.0.0.1:6379> rpush  listkey c b a 
      (integer) 3
      127.0.0.1:6379> lrange listkey 0 -1    #从左到右获取列表的所有元素
      1) "c"
      2) "b"
      3) "a"
      #O(k),k是元素的个数
      
    • 从左边插入元素 lpush key value [value ...] #O(k),k是元素的个数

    • 向某个元素前或者后 --插入元素 linsert key before|after pivot value

    • linsert命令会从列表中找到等于pivot的元素,在其前|后插入元素 --返回当前列表的长度

      127.0.0.1:6379> linsert listkey before b java     #在listkey列表中的元素b前面插入java元素
      (integer) 4
      127.0.0.1:6379> lrange listkey 0 -1
      1) "c"
      2) "java"
      3) "b"
      4) "a"
      
      # O(n),n是元素prvot距离列表头或尾部的距离
      
  • 2:删除

    • 从列表左侧弹出元素 lpop key

      127.0.0.1:6379> lrange listkey 0 -1
      1) "c"
      2) "java"
      3) "b"
      4) "a"
      127.0.0.1:6379> lpop listkey
      "c"
      
    • 从列表右侧弹出元素 rpop key

    • 删除指定元素 lrem key count value

      • count>0:从左到右,删除最多count个元素
      • count<0:从右到左,删除最多count 绝对值个元素
      • count=0:删除所有
      127.0.0.1:6379> lrange listkey 0 -1
      1) "a"
      2) "a"
      3) "a"
      4) "a"
      5) "a"
      6) "java"
      7) "b"
      8) "a"
      127.0.0.1:6379> lrem listkey 4 a     #从左边开始删除4个为a的元素
      (integer) 4
      127.0.0.1:6379> lrange listkey 0 -1
      1) "a"
      2) "java"
      3) "b"
      4) "a"
      
      #  O(n),n是列表长度
      
    • 按照索引范围保存[修剪]元素 ltrim key start end

      127.0.0.1:6379> lrange listkey 0 -1
      1) "a"
      2) "java"
      3) "b"
      4) "a"
      127.0.0.1:6379> ltrim listkey 1 3 
      OK
      127.0.0.1:6379> lrange listkey 0 -1
      1) "java"
      2) "b"
      3) "a"
      
      #O(n),n是要裁剪的元素总数
      
  • 3:修改

    • 修改指定索引下标的元素 lset key index newvalue

      127.0.0.1:6379> lrange listkey 0 -1
      1) "java"
      2) "b"
      3) "a"
      127.0.0.1:6379> lset listkey 2 python
      OK
      127.0.0.1:6379> lrange listkey 0 -1
      1) "java"
      2) "b"
      3) "python"
      
      #O(n)是索引的偏移量
      
  • 4:查找

    • 获取列表指定索引范围所有的元素 lrange key start end

      • 下标从左到右 0到N-1 ,从右到左是 -1 到 -N
      • start和end都包括,双闭区间-----和大多数编程语言不一样
      127.0.0.1:6379> lrange listkey 0 -1
      1) "java"
      2) "b"
      3) "a"
      
      #O(s+n):s是start的偏移量,n是start到end的范围
      
    • 获取列表指定索引下标的元素 lindex key index

      127.0.0.1:6379> lindex listkey -1
      "python"
      
    • 获取列表的长度 llen

      127.0.0.1:6379> llen listkey
      (integer) 3
      
  • 5 阻塞操作

    • blpop key [key....] timeout秒

    • brpop key [key ...] timeout

    • 1:列表为空
      127.0.0.1:6379> rpush list:test a  b c  d  #添加
      (integer) 4
      127.0.0.1:6379> lpop list:test
      "a"
      127.0.0.1:6379> lpop list:test
      "b"
      127.0.0.1:6379> lpop list:test
      "c"
      127.0.0.1:6379> lpop list:test
      "d"
      127.0.0.1:6379> lpop list:test    #依次弹出,直到为空
      (nil)
      127.0.0.1:6379> blpop list:test  3   #timeout=3.3秒后返回
      (nil)
      (3.09s)
      
      127.0.0.1:6379> blpop list:test  0  #timeout =0,一直阻塞等待下去
      
      
    • 2:列表不为空
      127.0.0.1:6379> lrange list:test 0 -1
      1) "b"
      2) "a"
      127.0.0.1:6379> blpop list:test 3    #列表不为空,则立即返回
      1) "list:test"
      2) "b"
      
  • 应用口诀:

  • lpush + lpop = Stack[栈]

  • lpush +rpop = Queue[队列]

  • lpush + ltrim = Capped Collection(有限集合)

  • lpush +brpop ==Message Queue(消息队列)

原文地址:https://www.cnblogs.com/zhoujun007/p/13131641.html