【Redis】Redis十大数据类型—列表List

news/2024/5/20 11:09:58/文章来源:https://blog.csdn.net/kuangd_1992/article/details/130234915

介绍

List列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向List列表添加元素。

列表的最大长度是2^32-1,也就是每个列表支持超过40亿个元素。

实现

底层数据结构是由双向链表或压缩列表实现。

  • 如果列表的元素个数小于 512 个(默认值,可由 list-max-ziplist-entries 配置),列表每个元素的值都小于 64 字节(默认值,可由 list-max-ziplist-value 配置),Redis 会使用压缩列表作为 List 类型的底层数据结构;
  • 如果列表的元素不满足上面的条件,Redis 会使用双向链表作为 List 类型的底层数据结构;

在Redis3.2版本之后,List数据类型底层数据结构就只由quicklist实现。

常用命令

在这里插入图片描述在这里插入图片描述

示例

LPUSH

LPUSH key element [element ...]

将一个或多个值value插入到key列表的表头(最左边),最后的值在最前面

127.0.0.1:6379> lpush k1 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange k1 0 -1
1) "4"
2) "3"
3) "2"
4) "1"

RPUSH

RPUSH key element [element ...]

将一个或多个值value插入到key列表的表尾(最右边)

127.0.0.1:6379> rpush k2 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"

LRANGE

LRANGE key start stop

返回列表key中指定区间内的元素,区间以偏移量start和stop指定,从0开始

LPOP

LPOP key [count]

移除并返回key列表的头元素,或者移除count个头元素

127.0.0.1:6379> lrange k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> LPOP k2 2
1) "1"
2) "2"
127.0.0.1:6379> lrange k2 0 -1
1) "3"
2) "4"
127.0.0.1:6379> LPOP k2
"3"
127.0.0.1:6379> lrange k2 0 -1
1) "4"

RPOP

RPOP key [count]

移除并返回key列表的尾元素

127.0.0.1:6379> lrange k2 0 -1
1) "4"
2) "k"
3) "u"
4) "a"
5) "n"
6) "g"
127.0.0.1:6379> RPOP k2
"g"
127.0.0.1:6379> lrange k2 0 -1
1) "4"
2) "k"
3) "u"
4) "a"
5) "n"
127.0.0.1:6379> RPOP k2 2
1) "n"
2) "a"
127.0.0.1:6379> lrange k2 0 -1
1) "4"
2) "k"
3) "u"

LINDEX

LINDEX key index

按照索引下标获得元素(从上到下)

127.0.0.1:6379> LRANGE k1 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> LINDEX k1 1
"3"
127.0.0.1:6379> LINDEX k1 0
"4"
127.0.0.1:6379> LINDEX k1 2
"2"

LLEN

LLEN key

获取列表中元素的个数

127.0.0.1:6379> LRANGE k1 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> LLEN k1
(integer) 3

LREM

LREM key count element

删除count 个值等于element的元素,返回值为实际删除的数量。

count等于0时,表示删除全部给定的值。

127.0.0.1:6379> LRANGE k3 0 -1
1) "v4"
2) "v3"
3) "v3"
4) "v2"
5) "v2"
6) "v1"
7) "v1"
8) "v1"
127.0.0.1:6379> LREM k3 2 v1
(integer) 2
127.0.0.1:6379> LRANGE k3 0 -1
1) "v4"
2) "v3"
3) "v3"
4) "v2"
5) "v2"
6) "v1"127.0.0.1:6379> LREM k3 0 v2
(integer) 2
127.0.0.1:6379> LRANGE k3 0 -1
1) "v4"
2) "v3"
3) "v3"
4) "v1"

LTRIM

LTRIM key start stop

截取指定索引区间的元素,然后赋值给key

127.0.0.1:6379> LRANGE k3 0 -1
1) "v4"
2) "v3"
3) "v3"
4) "v1"
127.0.0.1:6379> LTRIM k3 1 3
OK
127.0.0.1:6379> LRANGE k3 0 -1
1) "v3"
2) "v3"
3) "v1"

RPOPLPUSH

RPOPLPUSH source destination

移除列表的最后一个元素,并将该元素添加到另一个列表并返回

127.0.0.1:6379> LRANGE k2 0 -1
1) "g"
2) "n"
3) "a"
4) "u"
5) "k"
127.0.0.1:6379> LRANGE k1 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> RPOPLPUSH k1 k2
"1"
127.0.0.1:6379> LRANGE k2 0 -1
1) "1"
2) "g"
3) "n"
4) "a"
5) "u"
6) "k"
127.0.0.1:6379> LRANGE k1 0 -1
1) "4"
2) "3"
3) "2"

LSET

LSET key index element

设置索引为index的元素值为element。

127.0.0.1:6379> LSET k3 0 v5
OK
127.0.0.1:6379> LRANGE k3 0 -1
1) "v5"
2) "v3"
3) "v1"

LINSERT

LINSERT key <BEFORE | AFTER> pivot element

在list某个已有值pivot的前后再添加具体值element

127.0.0.1:6379> LRANGE k3 0 -1
1) "v5"
2) "v3"
3) "v1"
127.0.0.1:6379> LINSERT k3 before v3 v4
(integer) 4
127.0.0.1:6379> LRANGE k3 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v1"
127.0.0.1:6379> LINSERT k3 after v1 v6
(integer) 5
127.0.0.1:6379> LRANGE k3 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v1"
5) "v6"

BLPOP

BLPOP key [key ...] timeout

从key列表表头弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞

127.0.0.1:6379> lrange k2 0 -1
1) "u"
127.0.0.1:6379> BLPOP k2 0
1) "k2"
2) "u"
127.0.0.1:6379> BLPOP k2 0 #k2中没有元素,这时执行BLPOP,同时timeout为0,导致一直阻塞

BRPOP

BRPOP key [key ...] timeout

从key列表表尾弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞

应用场景

消息队列

消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息和保证消息可靠性

Redis 的 List 和 Stream 两种数据类型,就可以满足消息队列的这三个需求。我们先来了解下基于 List 的消息队列实现方法,后面在介绍 Stream 数据类型时候,在详细说说 Stream。

1、如何满足消息保序需求?

List 本身就是按先进先出的顺序对数据进行存取的,所以,如果使用 List 作为消息队列保存消息的话,就已经能满足消息保序的需求了。

List 可以使用 LPUSH + RPOP (或者反过来,RPUSH+LPOP)命令实现消息队列。

fd0282dbb76d666176d52f64bbae0ef8.png

  • 生产者使用 LPUSH key value[value...] 将消息插入到队列的头部,如果 key 不存在则会创建一个空的队列再插入消息。
  • 消费者使用 RPOP key 依次读取队列的消息,先进先出。

在生产者往 List 中写入数据时,List 并不会主动地通知消费者有新消息写入,如果消费者想要及时处理消息,就需要在程序中不停地调用 RPOP 命令(比如使用一个while(1)循环)。如果有新消息写入,RPOP命令就会返回结果,否则,RPOP命令返回空值,再继续循环。

所以,即使没有新消息写入List,消费者也要不停地调用 RPOP 命令,这就会导致消费者程序的 CPU 一直消耗在执行 RPOP 命令上,带来不必要的性能损失。

为了解决这个问题,Redis提供了 BRPOP 命令。BRPOP命令也称为阻塞式读取,客户端在没有读到队列数据时,自动阻塞,直到有新的数据写入队列,再开始读取新数据。和消费者程序自己不停地调用RPOP命令相比,这种方式能节省CPU开销。

2、如何处理重复的消息?

消费者要实现重复消息的判断,需要 2 个方面的要求:

  • 每个消息都有一个全局的 ID。
  • 消费者要记录已经处理过的消息的 ID。当收到一条消息后,消费者程序就可以对比收到的消息 ID 和记录的已处理过的消息 ID,来判断当前收到的消息有没有经过处理。如果已经处理过,那么,消费者程序就不再进行处理了。

但是 List 并不会为每个消息生成 ID 号,所以我们需要自行为每个消息生成一个全局唯一ID,生成之后,我们在用 LPUSH 命令把消息插入 List 时,需要在消息中包含这个全局唯一 ID。

例如,我们执行以下命令,就把一条全局 ID 为 111000102、库存量为 99 的消息插入了消息队列:

> LPUSH mq "111000102:stock:99"
(integer) 1

3、如何保证消息可靠性?

当消费者程序从 List 中读取一条消息后,List 就不会再留存这条消息了。所以,如果消费者程序在处理消息的过程出现了故障或宕机,就会导致消息没有处理完成,那么,消费者程序再次启动后,就没法再次从 List 中读取消息了。

为了留存消息,List 类型提供了 BRPOPLPUSH 命令,这个命令的作用是让消费者程序从一个 List 中读取消息,同时,Redis 会把这个消息再插入到另一个 List(可以叫作备份 List)留存

这样一来,如果消费者程序读了消息但没能正常处理,等它重启后,就可以从备份 List 中重新读取消息并进行处理了。

好了,到这里可以知道基于 List 类型的消息队列,满足消息队列的三大需求(消息保序、处理重复的消息和保证消息可靠性)。

  • 消息保序:使用 LPUSH + RPOP;
  • 阻塞读取:使用 BRPOP;
  • 重复消息处理:生产者自行实现全局唯一 ID;
  • 消息的可靠性:使用 BRPOPLPUSH

但是,在用 List 做消息队列时,如果生产者消息发送很快,而消费者处理消息的速度比较慢,这就导致 List 中的消息越积越多,给 Redis 的内存带来很大压力

要解决这个问题,就要启动多个消费者程序组成一个消费组,一起分担处理 List 中的消息。但是,List 类型并不支持消费组的实现

Redis 从 5.0 版本开始提供的 Stream 数据类型了,Stream 同样能够满足消息队列的三大需求,而且它还支持「消费组」形式的消息读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_479084.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv7如何提高目标检测的速度和精度,基于模型结构提高目标检测速度

目录 一、目标检测二、目标检测的速度和精度的权衡1、速度和精度的概念和定义2、如何评估目标检测算法的速度和精度3、速度和精度之间的权衡 三、基于模型结构提高目标检测速度1、Backbone网络的选择2、特征金字塔网络的设计3、通道注意力机制4、混合精度训练 一、目标检测 目…

3个实用的文字转语音方法,让你时刻保持信息更新!

现在&#xff0c;我们生活节奏加快&#xff0c;信息量也越来越大&#xff0c;有时候想了解新闻却又不想眼睛再去盯着手机屏幕了&#xff0c;这时候文字转语音工具就可以帮助我们实现听新闻的需求。如果你还不了解文字如何转换成语音&#xff0c;别担心&#xff0c;今天我将向大…

不同的场景上线时钟同步系统需要注意些什么

时钟同步系统一般都是用在学校或者医院的环境当中&#xff0c;一般时钟同步系统由硬件和软件相组成。对于局域网部署&#xff0c;通常使用NTP协议。对于广域网部署&#xff0c;通常需要考虑网络延迟和安全性等因素。此外&#xff0c;时钟同步系统在不同的使用场景当中的需求也不…

15天学习MySQL计划-多表联查(基础篇)第四天

15天学习MySQL计划&#xff08;多表联查&#xff09;第四天 1.多表查询 1.1概述 ​ 指从多张表中查询数据 ​ 在项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互…

记录-JavaScript常规加密技术

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 当今Web开发中&#xff0c;数据安全是一个至关重要的问题&#xff0c;为了确保数据的安全性&#xff0c;我们需要使用加密技术。JavaScript作为一种客户端编程语言&#xff0c;可以很好地为数据进行加…

sggJava基础第四天

1 分支结构 分支结构 根据条件&#xff0c;选择性地执行某段代码。 有if…else和switch-case两种分支语句。 概述 顺序结构的程序虽然能解决计算、输出等问题 但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构 if…else形式 单分支结构 代码实现 …

JWT 实现登录认证 + Token 自动续期方案

前言 过去这段时间主要负责了项目中的用户管理模块&#xff0c;用户管理模块会涉及到加密及认证流程。今天就来讲讲认证功能的技术选型及实现。技术上没啥难度当然也没啥挑战&#xff0c;但是对一个原先没写过认证功能的菜鸡来说也是一种锻炼吧。 技术选型 要实现认证功能&a…

JavaScript(JS)-1.JS基础知识

1.JavaScript概念 (1)JavaScript是一门跨平台&#xff0c;面向对象的脚本语言&#xff0c;来控制网页行为的&#xff0c;它能使网页可交互 (2)W3C标准&#xff1a;网页主要由三部分组成 ①结构&#xff1a;HTML负责网页的基本结构&#xff08;页面元素和内容&#xff09;。 …

Git从远程仓库克隆仓库后推送到指定分支

git克隆到本地仓库 在得到一个git仓库地址后&#xff0c;首先要配置本地仓库&#xff0c;配置远程仓库地址才可以远程拉取项目。 本地配置的一般流程&#xff1a; git init初始化一个空白git仓库 2. 配置在自己额用户名和邮箱 配置个人信息时方便再团队合作时能知道是谁再何…

适应大、中、小型医院的手术麻醉临床信息管理系统源码

手术麻醉管理系统是一款专门用于医院手术麻醉管理的软件系统&#xff0c;它可以帮助医院和医生更好地管理手术麻醉过程&#xff0c;提高手术麻醉的质量和安全性。本文将介绍手术麻醉管理系统的实现、功能概述、主要功能、系统设置、麻醉管理、术中记录、苏醒室记录、PCA实施及管…

番外12:ADS导出到AD变为PCB文件

番外12&#xff1a;ADS导出到AD变为PCB文件并嘉立创制板 番外12&#xff1a;ADS导出到AD变为PCB文件&#xff0c;此处的示例为功率放大器&#xff01; STEP 1: 从ADS导出dxf文件 打开制作好的版图文件&#xff0c;在原有基础上打好散热孔和固定孔&#xff0c;散热孔半径0.63…

基于禅道二开领导报表

上周开会的时候公司项目总监说感觉最近开发人员很轻松&#xff0c;工作量不饱和。支付力度不够。 做为开发负责人&#xff0c;对项目总监这个说法我肯定需要给予响应&#xff0c;不然老板也在场&#xff0c;后续项目想要加资源啥的都无法解释。 关注我的人知道&#xff0c;之前…

简单介绍十几款常用的画架构图流程图的软件

简单介绍十几款常用的画架构图流程图的软件 draw.io draw.io是开源免费的在线画图工具&#xff0c;还提供桌面版本。 特性&#xff1a; 实时协作&#xff1b;支持在线离线版本&#xff1b;存储支持多种方式&#xff1a;Google Drive, OneDrive, GitHub, GitLab, Dropbox等&…

StarRC的妙用

在整个R2G的流程里边&#xff0c;寄生参数抽取&#xff08;StarRC&#xff09;是比较没有存在感的。大部分的时间&#xff0c;工程师们只是用这个工具来刷SPEF。并不会关注太多。这本身其实是一个好事情&#xff0c;反向证明了参数抽取工具的高度稳定性&#xff01; 但是&#…

Android 对View 进行旋转、缩放、平移的属性变换后,获取外矩形顶点

文章目录 前言改变 View 的属性&#xff0c;进行旋转、缩放、平移输出 View 的属性 使用 matrix 映射 view 变换后的外矩形前(左)乘(preXxx)、后(右)乘(postXxx) 对映射结果的影响前(左)乘(preXxx) 的意义后(右)乘(postXxx) 结论 来张图 前言 Android View 通过平移、旋转、…

为什么APP也需要SSL证书?

通常我们会想到对网站使用SSL证书&#xff0c;来加密数据传输过程&#xff0c;确保信息不被篡改、泄露。对APP这类应用程序则选择软件签名证书&#xff0c;来进行数字签名和防止代码被恶意篡改。然而APP很容易获取到个人敏感信息&#xff0c;为了防止这些信息在传输过程中被有心…

Android ProtoLog动态开启相关wm logging源码分析补充

Android ProtoLog动态开启相关wm logging源码分析补充 针对上一节已经清楚了相关的代码中怎么可以打印到logcat中&#xff0c;其实本质上还就是protologtool这个工具对代码中的所有ProtoLog进行了相关的替换成了具体实现&#xff0c;最后会条件判断输出到Slog中 本文就重点来看…

IP协议头

IP 4位版本号&#xff08;version&#xff09;4位头部长度&#xff08;header length&#xff09;8位服务类型&#xff08;Type Of Service&#xff09;16位总长度&#xff08;total length&#xff09;16位标识&#xff08;id&#xff09;3位标志字段13位分片偏移&#xff08;…

PEIS源码 体检源码 医院体检系统源码

PEIS体检管理系统源码 PEIS源码 体检源码 医院体检系统源码 本套PEIS医院体检管理系统源码&#xff0c;采用C#语言开发&#xff0c;C/S架构&#xff0c;前台开发工具为Vs2012&#xff0c;后台数据库采用oracle大型数据库。有演示。 文末获取联系 PEIS体检管理系统适用于大中型…

03-Mybatis的基本使用-注解配置文件+xml配置文件

目录 1、环境准备 2、注解配置文件 基础操作01-通过ID删除数据 基础操作02-插入数据 基础操作03-更新数据 基础操作04-根据ID查询数据 基础操作05-条件查询数据 3、xml配置文件 1、环境准备 1. 创建数据库数据表 -- 部门管理 create table dept(id int unsigned prim…