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不空:立刻返回
123
brpop list:
test
0
1)
"list:test"
2)
"element1"
- List为空:
- timeout=0:一直阻塞
- timeout≠0:阻塞指定时间后返回
-
123456
brpop list:
test
3
(nil)
(3.10s)
brpop list:
test
0
...阻塞...
- 如果一次指定了多个K,那么只要其中有一个能返回就不会阻塞
- 如果一次指定了多个K,且K都为空,依次往它们中加入元素,那么会返回最先加入的那个
- 如果多个客户端对同一个K执行brpop,那么最先执行brpop命令的客户端可以获取到pop的值
1234567891011121314151617
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"
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性