【redis初阶】------List 列表类型

List 列表类型

列表类型是用来存储多个有序的字符串,如图1所示,a、b、c、d、e 五个元素从左到右组成了一

个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储 2^32 - 1 个元

素。在 Redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等(如图所示)。列表是一种比较灵活的数据结构,它可以

充当栈和队列的角色,在实际开发上有很多应用场景。

列表类型的特点:

1.列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表,例如要获取图的第 5 个元素,可以执行 lindex user:1:messages 4 或者倒数第 1 个元素,lindex

user:1:messages -1 就可以得到元素 e。

  1. 区分获取和删除的区别,例如图中的 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删

除,这个操作会导致列表的长度从 5 变成 4;但是执行 lindex 4 只会获取元素,但列表长度是不会变化的。

  1. 列表中的元素是允许重复的,例如图 2-21 中的列表中是包含了两个 a 元素的。

基本命令

LPUSH

将一个或者多个元素从左侧放入(头插)到 list 中。

语法:

复制代码
LPUSH key element [element ...]

**返回值:**插入后 list 的长度。

示例:

LPUSHX

在 key 存在时,将一个或者多个元素从左侧放入(头插)到 list 中。不存在,直接返回

语法:

复制代码
LPUSHX key element [element ...]

**返回值:**插入后 list 的长度。

示例:

RPUSH

将一个或者多个元素从右侧放入(尾插)到 list 中。

语法:

复制代码
RPUSH key element [element ...]

**返回值:**插入后 list 的长度。

示例:

RPUSHX

在 key 存在时,将一个或者多个元素从右侧放入(尾插)到 list 中。

语法:

复制代码
RPUSHX key element [element ...]

**返回值:**插入后 list 的长度。

示例:

LRANGE

获取从 start 到 end 区间的所有元素,左闭右闭。

语法:

复制代码
LRANGE key start stop

**返回值:**指定区间的元素。

示例:

LPOP

从 list 左侧取出元素(即头删)。

语法:

复制代码
LPOP key

**返回值:**取出的元素或者 nil。

示例:

RPOP

从 list 右侧取出元素(即尾删)。

语法:

复制代码
RPOP key

**返回值:**取出的元素或者 nil。

示例:

LREM

删除列表中对应的元素。

语法:

复制代码
LREM key count element
 
# count 代表想要删除元素的个数
    count > 0:移除等于从头移动到尾的元素。
    count < 0:移除从尾部移动到头部的元素。
    count = 0:删除所有等于element的元素。
 
# element 代表要删除的值
LTRIM

获取指定区间的值,并将区间外的值删除。

语法:

复制代码
LTRIM key start stop

示例:

LSET

根据指定下标,修改元素。

语法:

复制代码
LSET key index element

示例:

LINDEX

获取从左数第 index 位置的元素。

语法:

复制代码
LINDEX key index

**返回值:**取出的元素或者 nil。

示例:

LINSERT

在特定位置插入元素。

语法:

复制代码
LINSERT key <BEFORE | AFTER> pivot element

**返回值:**插入后的 list 长度。

示例:

LLEN

获取 list 长度。

语法:

复制代码
LLEN key

**返回值:**list 的长度。

示例:

阻塞版本的理解

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本一致,除了

  1. 在列表中有元素的情况下,阻塞和非阻塞表现是一致的。但如果列表中没有元素,非阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞一段时间,期间 Redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态

  2. 命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表中可以弹出素,命令立即返回。

  3. 如果多个客户端同时对一个键执行 pop,则最先执行命令的客户端会得到弹出的元素。

BLPOP

LPOP 的阻塞版本。

语法:

复制代码
BLPOP key [key ...] timeout

**返回值:**取出的元素或者 nil。

示例:

BRPOP

RPOP 的阻塞版本。

语法:

复制代码
BRPOP key [key ...] timeout

**返回值:**取出的元素或者 nil。

示例:

阻塞等待列表,只要有一个列表存在数据就直接返回,不查看其他列表有没有数据;

内部编码

列表类型的内部编码有两种:

• ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的长度都小于 list-max-ziplist-value 配置(默认 64字节)时,Redis 会选用ziplist 来作为列表的内部编码实现来减少内存消耗。

• linkedlist(链表):当列表类型无法满足 ziplist 的条件时,Redis 会使用 linkedlist 作为列表的内部实现。

1)当元素个数较少且没有大元素时,内部编码为 ziplist:

2)当元素个数超过 512 时,内部编码为 linkedlist:

3)当某个元素的长度超过 64字节时,内部编码为 linkedlist:

quicklist 相当于是 链表 和 压缩列表 的结合整体还是一个链表,链表的每个节点,是一个压缩列表,每个压缩列表,都不让它太大,同时再把多个压缩列表通过链式结构连起来;

使用场景

消息队列

如图所示,Redis 可以使用 lpush + brpop 命令组合实现经典的阻塞式生产者-消费者模型队

列,生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式 地从队列中 "争抢" 队首元素。通过多个客户端来保证消费的负载均衡和高可用性。

分频道的消息队列

如图所示,Redis 同样使用 lpush + brpop 命令,但通过不同的键模拟频道的概念,不同的消费

者可以通过 brpop 不同的键值,实现订阅不同频道的理念。

多个列表 / 频道 这种场景非常常见的,日常使用的一些程序:抖音。有一个通道,来传输短视频数

据,还可以有一个通道,来传输弹幕,还可以有频道,来传输 点赞、转发、收藏数据还可以有频道来传输 评论 数据搞成多个频道,就可以在某种数据发生问题的时候不会对其他数据造成影响.(解耦合)

微博 Timeline

每个用户都有属于自己的 Timeline(微博列表),现需要分页展示文章列表。此时可以考虑使用列

表,因为列表不但是有序的,同时支持按照索引范围获取元素。

1)每篇微博使用哈希结构存储,例如微博中 3 个属性:title、timestamp、content:

2)向用户 Timeline 添加微博,user:<uid>:mblogs 作为微博的键:

3)分页获取用户的 Timeline,例如获取用户 1 的前 10 篇微博:

💡 选择列表类型时,请参考:

同侧存取(lpush + lpop 或者 rpush + rpop)为栈

异侧存取(lpush + rpop 或者 rpush + lpop)为队列

相关推荐
liliangcsdn22 分钟前
如何使用python创建和维护sqlite3数据库
数据库·sqlite
TDengine (老段)7 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)7 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
RoboWizard7 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿
安当加密7 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
爱喝白开水a7 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽7 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
武子康8 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
longgyy8 小时前
5 分钟用火山引擎 DeepSeek 调用大模型生成小红书文案
java·数据库·火山引擎
学无止境w8 小时前
高并发系统架构设计原则:无状态、水平扩展、异步化、缓存优先
缓存·系统架构