Redis List类型

Redis List类型

Redis的List类型有两种编码:zipList和linkedList

zipList中所有的节点都是连续的在内存中排列的,加载速度快,zipList结构设计也是为了节约内存空间,但是不适合存储大量的节点

linkedList是链表结构,逻辑连续,在内存中可能是分散到各个内存空间碎片中的,因为不要求内存一定要连续,所以适合存储大量的节点

编码转换条件

  1. 列表中所有节点的长度都小于64字节
  2. 列表对象保存的节点数量小于512个

命令详解

  • LPUSH:在头部添加1个或多个节点,当key不存在时,创建一个List并将节点添加进去,否则直接在原有key的List上添加。LPUSH <key> <elem> [elem ..]

    LPUSH a 1 2 3
    
  • LRANGE:查看指定范围的节点,0:开始位置,-1:结束位置,LRANGE <key> <startIndex> <stopIndex>

    LRANGE a 0 -1	// 3 2 1
    

    发现取出来的顺序和存放的顺序是反的,因为LPUSH每次添加的节点都会在List的头部添加,后加的节点反而在最前面

  • LLEN:求List的长度,LLEN <key>

    LPUSH a 1 2 3
    LLEN a	// 3
    
  • LPUSHX:只有key存在的时候才能往里面放节点,LPUSHX <key> <elem> [elem ..]

    LPUSHX b 1 2 3	// 返回0
    LRANGE b 0 -1	// (empty array)
    
  • LPOP:返回左边(首部)第一个节点,LPOP <key>

    LPUSH a 1 2 3
    LPOP a	// 3
    
  • RPOP:返回右边(尾部)第一个节点,语法和LPOP一样,RPOP <key>

  • BLPOP:阻塞式弹出头部节点,必须带有超时时间(timeout),单位为秒,如果List中有节点就立即返回,如果没有就阻塞timeout秒,直到有数据插入就立即返回。如果指定多个key,只要有一个key指向的List里面有数据就立即返回,BLPOP <key> [key ..] <timeout>

    BLPOP a 1	// 如果没有数据,阻塞1秒,否则立即返回    
    ------------
    LPUSH a 1	// 可以开启另一个终端,向a里面放数据,这时候被BLPOP阻塞的终端检测到a有数据进来了,就立即返回
    
  • BRPOP:阻塞时在尾部弹出一个节点,用法和BLPOP一样,BRPOP <key> [key ..] timeout

  • BRPOPLPUSH:阻塞时在尾部弹出一个节点,并加入到另一个List的头部,相当于BRPOP+RPOPLPUSH的结合体,BRPOPLPUSH <source> <destination> <timeout>

  • RPUSH:在右边(尾部)插入一个或多个节点,和LPUSH语法一样,RPUSH <key> <elem> [elem ..]

  • RPUSHX:在右边(尾部)插入一个或多个节点,和LPUSHX语法一样,RPUSHX <key> <elem> [elem ..]

  • RPOPLPUSH:在List尾部弹出一个节点并加到另一个List的头部,如果另一个List不存在则创建,RPOPLPUSH <source> <destination>

    LPUSH a 1 2
    RPOPLPUSH a b
    LRANGE a 0 -1	// 2
    LRANGE b 0 -1 	// 1
    
  • LREM:删除List重复的n个节点,LREM <key> <count> <elem>

    LPUSH a 1 2 1 2 3
    LREM a 2 1		// 删除2个重复的1
    LRANGE a 0 -1	// 3 2 2 
    
  • LINDEX:获取指定下标的节点,LINDEX <key> <index>

    LPUSH a a b c
    LINDEX a 1	// b
    
  • LINSERT:在节点(positionElem)的前面(BEFORE)还是后面(AFTER)插入一个节点(insertElem),LINSERT <key> BEFORE|AFTER <positionElem> <insertElem>

    LPUSH a 1 2 3
    LINSERT a BEFORE 2 12
    LRANGE a 0 -1	// 3 12 2 1
    
  • LSET:设置指定下标节点的新值,LSET <key> <index> <elem>

    LPUSH a 1 2 3
    LSET a 2 22
    LRANGE a 0 -1	// 3 2 22
    
  • LTRIM:将原有List裁剪成指定范围的List,LTRIM <key> <start> <end>

    LPUSH a 1 2 3 4 5
    LTRIM a 0 2
    LRANGE a 0 -1	// 5 4 3
    
上一篇:redis常见的五种数据结构-List场景


下一篇:图像识别实战(二)----搭建网络模型