redis:List

 

1、前言

与Java中的LinkedList类似,可以看做一个双向链表,同时支持正反向检索

List用于存储多个有序字符串,List中存放的每个字符串称为元素,一个List最多可以存储2^32-1个元素。

有序:可以通过下表的方式获取元素或者某个范围内的元素List

在Redis中,可以在List两端进行插入(Push)弹出(Pop)、获取指定位置、指定范围的元素。

特征:

  • 有序
  • 元素可重复
  • 增删速度快
  • 查询速度一般

内部编码

List有两种内部编码:

  • ziplist(压缩列表):当List元素个数 < list-max-ziplist-entries(默认512),同时每个元素的V值都< list-max-ziplist-value(默认64B),使用ziplist作为List的内部实现;
  • linkedlist(链表):当List无法满足ziplist的条件,转而使用linkedlist。

2、常用命令

命令

用法

说明

lpush

rpush

lpush/rpush K V1 V2 V3 往K的左/右插入V

lpop

rpop

lpop/rpop K 从K的左/右移除一个V
llen llen K K中元素个数
lrange lrange K start end

返回K中从start到end区间内的元素

使用非负下标时:以0为第一个元素,1为第二个元素

使用负数下标时:以-1为最后一个元素,-2为倒数第二个元素

当start为0,end为-1时,代表全部

lindex lindex K n

返回下标为n的元素

可用负数,以-1为最后一个元素,-2为倒数第二个元素

ltrim ltrim K start end

只保留在区间start到end的元素,删除不在指定区间的。

下标写法同上

blpop

brpop

blpop K [K2 K3 ...] timeout

阻塞式弹出

1、插入

用法

  • rpush K V [V2 V3 ...]:右插
  • lpush K V [V2 V3 ...]:左插

说明

如果有多个V,则V的分布为(从左到右/从右到左,可以理解为把这些元素当做一个List/反List,整体插入)

2、lrange:取区间内的元素

用法:lrange K start stop

说明

  • 区间以偏移量 start 和 stop 指定;
  • 下标(index)参数 start 和 stop 都以 0 为底,即 0 表示列表中的第一个元素,1 表示列表的第二个元素,以此类推;
  • 使用负数下标时,以 -1 表示列表的最后一个元素,-2 表示列表的倒数第二个元素,以此类推;
  • 当start为0,end为-1时,代表全部。

3、linsert:元素前后插入

用法:linsert K before/after V V2

说明

  • 往K中V的左/右插入新值V2
  • 这里的V是指元素值,而非下标

返回值

新list的长度

例子

往元素b前插入元素java

1
2
127.0.0.1:6379> linsert listkey before b java
(integer) 4

  

4、lindex:获取指定索引的元素

用法:lindex K index

说明

  • 相当于list[index]
  • 0代表第一个元素
  • 使用负数下标时,-1代表最后一个元素

5、llen:list长度

用法:llen K

6、lpop/rpop:弹出

用法:

  • lpop K
  • rpop K

7、lrem:定向删除

用法

  • lrem K count V

说明

  • 删除list中的所有V
  • count>0,从左到右,最多count个;
  • count<0,从右到左,最多count个;
  • count=0,全部

 

 

8、ltrim:修剪,保留指定区间内的元素,删除不在区间内的元素

用法:ltrim K start end

说明:

  • start和end的用法和前边所说相同

9、lset:修改指定下标处的元素

用法:lset K index newV

说明

  • 将list[index]的值修改为newV

10、blpop/brpop:阻塞式弹出

用法:

  • blpop K [K2 K3 ...] timeout
  • brpop K [K2 K3 ...] timeout

参数

  • K [K2 K3 ...]:多个list的K
  • timeout:阻塞时间(s)

说明

关于timeout的用法:

  • List不空:立刻返回
    1
    2
    3
    brpop list:test 0
    1) "list:test"
    2) "element1"
  • List为空:
    • timeout=0:一直阻塞
    • timeout≠0:阻塞指定时间后返回
  • 1
    2
    3
    4
    5
    6
    brpop list:test 3
    (nil)
    (3.10s)
     
    brpop list:test 0
    ...阻塞...
  • 如果一次指定了多个K,那么只要其中有一个能返回就不会阻塞
  • 如果一次指定了多个K,且K都为空,依次往它们中加入元素,那么会返回最先加入的那个
  • 如果多个客户端同一个K执行brpop,那么最先执行brpop命令的客户端可以获取到pop的值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    client-1> brpop list:test 0
    ...阻塞...
     
    client-2> brpop list:test 0
    ...阻塞...
     
    client-3> brpop list:test 0
    ...阻塞...
     
    client-lpush> lpush list:test element
    (integer) 1
     
     
    //client1会获取到元素,因为客户端1最先执行brpop,剩下两个继续阻塞
    client-1> brpop list:test 0
    1) "list:test"
    2) "element"

      


 

posted @   ShineLe  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示