Redis五大基本数据类型之List类型

一、List 类型数据的基本操作

1.1 List 元素的性质

  1. 可以把List当成一个栈、或队列来使用
    1. lpushlpop则为栈
    2. lpushrpop则为队列
  2. 所有的List命令均以l开头

    1.2 向列表中添加元素

  3. lpush key value1 ... valuen:将valuei依次插入到列表key的头部

    1. 127.0.0.1:6379> keys *
    2. (empty list or set)
    3. 127.0.0.1:6379> lpush list1 v1
    4. (integer) 1
    5. 127.0.0.1:6379> lpush list1 v2
    6. (integer) 2
    7. 127.0.0.1:6379> lpush list1 v3
    8. (integer) 3
    9. 127.0.0.1:6379> keys *
    10. 1) "list1"
  4. lrange key start stop:取出key对应的List中从startstop(包括stop)的所有元素

    1. 127.0.0.1:6379> keys *
    2. 1) "list1"
    3. 127.0.0.1:6379> lrange list1 0 -1
    4. 1) "v3" # 由于每次插入到头部,所以先取出的是最后一次插入的值 v3
    5. 2) "v2"
    6. 3) "v1"
  5. rpush key value1 ... valuen:将valuei依次插入到列表key的尾部

    1. 127.0.0.1:6379> lrange list1 0 -1
    2. 1) "v3"
    3. 2) "v2"
    4. 3) "v1"
    5. 127.0.0.1:6379> rpush list1 right1 right2
    6. (integer) 5
    7. 127.0.0.1:6379> lrange list1 0 -1
    8. 1) "v3"
    9. 2) "v2"
    10. 3) "v1"
    11. 4) "right1"
    12. 5) "right2"
  6. linsert key before|after pivot value:在列表key中元素pivot的(前before|after后)插入元素value

    1. 127.0.0.1:6379> lrange mylist 0 -1
    2. 1) "hello"
    3. 2) "world"
    4. 127.0.0.1:6379> linsert mylist before world insert
    5. (integer) 3
    6. 127.0.0.1:6379> lrange mylist 0 -1
    7. 1) "hello"
    8. 2) "insert"
    9. 3) "world"
    10. 127.0.0.1:6379> linsert mylist after world after
    11. (integer) 4
    12. 127.0.0.1:6379> lrange mylist 0 -1
    13. 1) "hello"
    14. 2) "insert"
    15. 3) "world"
    16. 4) "after"

    1.3 将元素移出列表

    1. lpop key:移除列表key的头部元素
    2. rpop key:移除列表key的尾部元素
      1. 127.0.0.1:6379> lrange list1 0 -1
      2. 1) "v3"
      3. 2) "v2"
      4. 3) "v1"
      5. 4) "right1"
      6. 5) "right2"
      7. 127.0.0.1:6379> lpop list1 # 移除列表key的头部元素
      8. "v3"
      9. 127.0.0.1:6379> rpop list1 # 移除列表key的尾部元素
      10. "right2"
      11. 127.0.0.1:6379> lrange list1 0 -1
      12. 1) "v2"
      13. 2) "v1"
      14. 3) "right1"

      1.4 列表特定数据操作

  7. lindex key index:获取列表key下标index对应的元素值

    1. 127.0.0.1:6379> lrange list1 0 -1
    2. 1) "v2"
    3. 2) "v1"
    4. 3) "right1"
    5. 127.0.0.1:6379> lindex list1 1 # 通过下标获得列表中的值
    6. "v1"
    7. 127.0.0.1:6379> lindex list1 0
    8. "v2"
  8. llen key:获取列表key的长度

    1. 127.0.0.1:6379> llen list1
    2. (integer) 3
  9. lrem key count value:移除列表keycount个值为value的元素

    1. 127.0.0.1:6379> lrange list1 0 -1
    2. 1) "v2"
    3. 2) "v1"
    4. 3) "right1"
    5. 127.0.0.1:6379> lrem list1 1 v2
    6. (integer) 1
    7. 127.0.0.1:6379> lrange list1 0 -1
    8. 1) "v1"
    9. 2) "right1"
  10. ltrim key start stop:从startstop截取列表key并替换原有的列表key

    1. 127.0.0.1:6379> keys *
    2. (empty list or set)
    3. 127.0.0.1:6379> rpush mylist hello hello1 hello2 hello3
    4. (integer) 4
    5. 127.0.0.1:6379> lrange mylist 0 -1
    6. 1) "hello"
    7. 2) "hello1"
    8. 3) "hello2"
    9. 4) "hello3"
    10. 127.0.0.1:6379> ltrim mylist 1 2 # 截取列表 mylist 的第 1 到 2 个元素
    11. OK
    12. 127.0.0.1:6379> lrange mylist 0 -1
    13. 1) "hello1"
    14. 2) "hello2"
  11. lset key index value:更新列表key的指定下标index的元素为value

    1. 127.0.0.1:6379> lset mylist 0 hello
    2. (error) ERR no such key # 列表不存在时无法更新
    3. 127.0.0.1:6379> lpush mylist hello
    4. (integer) 1
    5. 127.0.0.1:6379> lset mylist 0 hellochange
    6. OK
    7. 127.0.0.1:6379> lrange mylist 0 -1
    8. 1) "hellochange"
    9. 127.0.0.1:6379> lset mylist 2 hello2
    10. (error) ERR index out of range # index 超过列表长度时,无法更新
    11. 127.0.0.1:6379> lset mylist 1 hello1
    12. (error) ERR index out of range

    1.5 组合命令

  12. rpoplpush source destination:将列表source的尾部元素取出并插入到列表destination的头部

    1. 可以用做移动元素
    2. 不存在rpoprpushlpoprpushlpoplpush命令
      1. 127.0.0.1:6379> lpush mylist hello hello1 hello2
      2. (integer) 3
      3. 127.0.0.1:6379> lrange mylist 0 -1
      4. 1) "hello2"
      5. 2) "hello1"
      6. 3) "hello"
      7. 127.0.0.1:6379> rpoplpush mylist myotherlist
      8. "hello"
      9. 127.0.0.1:6379> lrange mylist 0 -1
      10. 1) "hello2"
      11. 2) "hello1"
      12. 127.0.0.1:6379> lrange myotherlist 0 -1
      13. 1) "hello"

      1.6 列表元素判断

  13. exists key:判断列表key是否存在

    1. 127.0.0.1:6379> exists mylist
    2. (integer) 0

    二、小结

  14. List类型数据实际上是一个链表

  15. 如果key不存在则需要创建新的链表
  16. 如果key存在,则可以直接新增内容
  17. 如果移除了所有的值,则变为空链表,也代表不存在
  18. 在两边插入或者改动值的效率最高,中间元素的编辑效率相对较低