1、列表类型内部是使用双向链表(double linked list)实现的,所以想两端添加元素特快,时间复杂度是O(1),获取越接近两端的元素速度越快。不过代价是通过索引访问元素的速度会比较慢。

2、每个键最多能容纳的字段数量与列表相同都是 2^32 - 1 个元素。内部用来存储字段数量的变量类型应该是Integer,因为一个整形是4个字节,每个字节8位,刚好32位,最大数字就是 2^32-1 个(包括0)。

2.1、索引是从0开始

3、LPUSH key value 在队列的左边添加元素,返回队列元素的长度。   

127.0.0.1:6379> lpush list 123
                (integer) 3
           127.0.0.1:6379> lpush list 123
                (integer) 4

     一次性添加多个元素

127.0.0.1:6379> LPUSH list 11 12 13

4、LRANGE key start end 返回队列中[start ,end] 之间的元素,和素组一样从0开始,包含end位。

     如果start > end 则返回空列表

127.0.0.1:6379> LRANGE list 3  2
                (empty list or set)

     如果end > LLEN key 则返回所有列表

127.0.0.1:6379> LLEN list
 
                (integer) 4
           127.0.0.1:6379> LRANGE list 0 8
                1) "4"
                2) "3"
                3) "2"
                4) "1"

     如果end=-1  LRANGE key 0 -1 返回所有列表

127.0.0.1:6379> LRANGE list 0 -1
                1) "4"
                2) "3"
                3) "2"
                4) "1"

     倒序取数据,start end 都小于0

127.0.0.1:6379> LRANGE list 0 -1

1) "7"2) "6"3) "5"4) "4"5) "3"6) "2"7) "1"

127.0.0.1:6379> LRANGE list -1 -1
                1) "1"
           127.0.0.1:6379> LRANGE list -2 -1
                1) "2"
                2) "1"

5、LLEN key 获取列表的长度

127.0.0.1:6379> LLEN list
                 (integer) 4

6、RPUSH key value 在队列的右边添加元素,返回元素长度

127.0.0.1:6379> RPUSH list -1
                (integer) 5

127.0.0.1:6379> LRANGE list 0 -1
1) "4"2) "3"3) "2"4) "1"

                5) "-1"

7、LPOP/RPOP 弹出左/右边的元素

127.0.0.1:6379> LPOP list
     "4"
127.0.0.1:6379> LRANGE list 0 -1
        1) "3"
2) "2"3) "1"4) "-1"
127.0.0.1:6379> RPOP list
          "-1"
127.0.0.1:6379> LRANGE list 0 -1
1) "3"2) "2"

8、LREM key count value 删除 count 个值为value的元素

          当count > 0 从左边删除count个值value的元素

          当count<0  从右边删除 |count|  个值value的元素

          当count = 0 删除所有值为 value 的元素

          127.0.0.1:6379> LRANGE list 0 -1

1) "1"2) "1"3) "1"4) "1"5) "1"6) "3"7) "2"
127.0.0.1:6379> LREM list 0 1
     (integer) 5
127.0.0.1:6379> LRANGE list 0 -1

               1) "3"

                 2) "2"

9、LSET key index value 在索引index处添加值value

          127.0.0.1:6379> LRANGE list 0 -1

1) "13" 
    2) "12" 
    3) "11" 
    4) "7" 
    5) "6" 
    6) "5" 
    7) "4" 
    8) "3" 
    9) "2"
               10) "1"

          127.0.0.1:6379> LSET list  3 8 9 10 不能同时设置多个值


ERR wrong number of arguments for 'lset' command
    127.0.0.1:6379> LSET list  3 8 
               OK 
     127.0.0.1:6379> LRANGE list 0 -1 
    1) "13"  
    2) "12"  
    3) "11" 
    4) "8" 
    5) "6" 
    6) "5"  
    7) "4" 
    8) "3" 
    9) "2"
       10) "1"

10、LINDEX list 0根据索引获取值

127.0.0.1:6379> LINDEX list 0 
 
                "13"

12、LTRIM key start end 移掉除(start,end)之外的数据。保留[start,end]数据,包括start,end

     127.0.0.1:6379> LRANGE list 0 -1

1) "5" 
    2) "4" 
    3) "3" 
    4) "2" 
    5) "1"
     127.0.0.1:6379> LTRIM list 1 3

               OK
     127.0.0.1:6379> LRANGE list 0 -1

1) "4" 
    2) "3"
                3) "2"
13、LINSET key BEFORE | AFTER pivot value 插入数据

127.0.0.1:6379> LRANGE list 0 -1 
    1) "4" 
    2) "3" 
    3) "2"
    127.0.0.1:6379> LINSERT list before 4 5 
      (integer) 4 
   127.0.0.1:6379> LRANGE list 0 -1 
   1) "5" 
   2) "4" 
   3) "3"

               4) "2"

127.0.0.1:6379> LINSERT list after 2 0 
    (integer) 5 
 127.0.0.1:6379> LRANGE list 0 -1 
  1) "5" 
   2) "4" 
   3) "3" 
   4) "2"

              5) "0"

     如果有多个相同的pivot,则从左边数第一个开始

          127.0.0.1:6379> LRANGE list 0 -1

1) "4"   
    2) "5" 
    3) "4" 
    4) "3"  
    5) "2" 
    6) "0" 
    127.0.0.1:6379> LINSERT list after 4 3 
              (integer) 7 
  127.0.0.1:6379> LRANGE list 0 -1 
         1) "4" 
    2) "3" 
    3) "5" 
    4) "4" 
    5) "3" 
    6) "2"
                7) "0"

        BEFORE 也是从左边第一个开始

127.0.0.1:6379> LINSERT list Before 3 9 
       (integer) 8 
   127.0.0.1:6379> LRANGE list 0 -1 
   1) "4"  
    2) "9" 
    3) "3" 
    4) "5" 
    5) "4"  
    6) "3"  
    7) "2"
           8) "0"

RPOPLPUSH source destination --列表类型,将元素从一个列表转移到另一个列表

         从source右边弹出一个元素,再LPUSH到destination进去

          RPOPLPUSH source destination

     内部实现:


def rpoplpush( source , destination)
        value = RPOP source
          LPUSH destination value
          return value

15、汇总

     A、列表可以作为栈使用,LPUSH/LPOP 或者 RPUSH/RPOP

     B、作为list使用,LPUSH/RPOP 或者 RPUSH/LPOP