7.List类型

List相当于数组 或 顺序表;**编码方式上,类似于双端队列,**头插头删时间复杂度O(1);支持下标进行访问,头从0开始,支持负数下标;

1.列表特性

列表是有序的:[1,2,3] 和 [3,2,1] 是不同的列表,元素放置的顺序不同,列表不同;

列表元素是允许重复的;

列表的头尾插入删除时间复杂度都是O(1),因此适合实现 栈/队列 等结构;(Redis最早用作消息队列时就是通过list类型,后通过stream类型)

2.列表命令

2.1 lpush、lpushx、rpush、rpushx、lrange

lpush key element [...] 头插元素 返回值:插入后列表长度

注:key存在,且value类型不为list就报错;

lpushx key element [...] 头插元素,当key存在时才插入 返回值:插入后列表长度

rpush key element[...] 尾插元素 返回值:插入后列表长度

rpushx key element[...] 尾插元素,当key存在时才插入 返回值:插入后列表长度

lrange key start stop 取出从start到stop所有元素,时间复杂度O(N)

2.2 lpop、rpop、lindex、linsert、llen

lpop key 头删,O(1),返回值:被删除的元素

rpop key 尾删,O(1),返回值:被删除的元素

注:redis 6.2及以上版本,lpop和rpop可以带[count],表示删除几个

lindex key index 获取从左往右数下标位置的元素 返回值:元素 或 nil,时间复杂度:O(N)

linsert key <BEFORE | AFTER> pivot element 在基准值之前或之后插入元素,

返回值:插入后列表元素个数 或 -1(如果pivot不存在,不插入,返回-1)

时间复杂度:O(N)

llen key 获取列表长度

2.3 lrem、ltrim、lset

lrem key count element 删除count个值等于element元素

时间复杂度:O(N)

返回值:实际删除的element个数
count>0,从左往右删;
count<0,从右往左删;

count=0,删除全部等于element的;

ltrim key start stop 只保留[start, stop]区间内的元素

lset key index element 修改index下标位置的值,下标越界报错。O(N)

2.4 blpop、brpop

阻塞:当前线程不往后执行了,会在满足一定条件后被唤醒;

如果list不为空,直接删除后返回即可;

如果list为空,blpop和brpop就会阻塞,直到list不为空为止;

阻塞队列(生产者消费者模型)特性:

1)线程安全

2)队列满了,生产者入队列阻塞;队列空了,消费者出队列阻塞

redis的list相当于阻塞队列,线程安全是通过单线程模型来实现的;且只考虑队列为空情况;

blpop和brpop可以显式设置阻塞时间timeout,阻塞期间redis可以执行其他命令,并不会对redis执行命令线程造成负面影响;

blpop key [...] timeout 可以一次等待多个key,timeout可以为小数,单位秒

brpop key [...] timeout 可以一次等待多个key

多个客户端执行blpop,最先到达的先执行。

返回值:来自于哪个key,删除的是哪个元素;

3.列表编码方式

ziplist 和 linkedlist,过时;

quicklist,压缩列表和链表的结合,整体是一个链表,单个节点是一个压缩列表;

配置文件:/etc/redis/redis.conf 中 list-max-ziplist-xxx 过时

4.列表应用场景

4.1 作为数组存储多个元素

模拟mysql表结构:

使用key-list结构,list存储具体的属性信息。

4.2 使用redis作为消息队列

通过blpop、brpop命令来实现,只关注列表为空情况;

相关推荐
身如柳絮随风扬15 小时前
Redis中的哈希槽怎么理解
redis·哈希算法
未秃头的程序猿16 小时前
🚀 从“单机崩盘”到“集群稳如狗”:Redis 高可用避坑指南(保姆级实战)
redis·后端·面试
见山是山-见水是水18 小时前
鸿蒙flutter第三方库适配 - 汇率换算器
redis·flutter·华为·harmonyos
014-code18 小时前
Redis 删除缓存失败怎么办?重试、死信、补偿的工程化方案
数据库·redis·缓存
rannn_11118 小时前
【Redis|高级篇1】分布式缓存|持久化(RDB、AOF)、主从集群、哨兵、分片集群
java·redis·分布式·后端·缓存
PD我是你的真爱粉18 小时前
Redis 持久化、过期删除、淘汰策略与内存碎片全解析
java·redis·bootstrap
斌味代码18 小时前
Redis 分库分表实战:从垂直拆分到水平扩容完整记录
数据库·redis·bootstrap
rchmin18 小时前
阿里Tair分布式锁与Redis分布式锁的实现区别
数据库·redis·分布式
win x1 天前
Redis 使用~如何在Java中连接使用redis
java·数据库·redis
程序员萌萌1 天前
Redis的缓存机制和淘汰策略详解
数据库·redis·缓存机制·淘汰策略