Redis——常用数据类型List

目录

      • List列表
        • 常用命令
          • lpush
          • lpushx
          • rpush
          • rpush
          • lrange
          • lpop
          • rpop
          • lindex
          • linsert
          • llen
          • lrem
          • ltrim key start stop
          • lset
        • 阻塞版本命令
          • blpop
          • brpop
        • list的编码方式
        • list的应用

List列表

Redis中的list相当于数组,或者 顺序表,一些常用的操作可以通过下面这张图来理解

在这里插入图片描述

实际上,这个并不是一个简单的数组,而是类似于一个“双端队列”

在这里插入图片描述

列表类型的特点:

  1. 列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表,例如要上图的第 5 个元素,可以执行 lindex user:1:messages 4 或者倒数第 1 个元素,lindexuser:1:messages -1 就可以得到元素 e
  2. 区分获取和删除的区别,例如图 2-20 中的 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删除,这个操作会导致列表的长度从 5 变成 4;但是执⾏ lindex 4 只会获取元素,但列表长度是不会变化的
  3. 列表中的元素是允许重复的,如下图

在这里插入图片描述

常用命令
lpush
LPUSH key element [element ...]//将⼀个或者多个元素从左侧放⼊(头插)到 list 中
//时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数
//返回值:插⼊后 list 的⻓度
lpushx
 LPUSHX key element [element ...]//在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回
//时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数
//返回值:插⼊后 list 的⻓度
rpush
RPUSH key element [element ...]//将⼀个或者多个元素从右侧放⼊(尾插)到 list 中
//时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数
//返回值:插⼊后 list 的⻓度
rpush
RPUSHX key element [element ...]//在 key 存在时,将⼀个或者多个元素从右侧放⼊(尾插)到 list 中
//时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数
//返回值:插⼊后 list 的⻓度
lrange
 LRANGE key start stop//获取从 start 到 end 区间的所有元素,左闭右闭,下标支持负数
//时间复杂度:O(N)
//返回值:指定区间的元素,如果给定区间非法,比如超出下标,Redis中会尽可能的获取区间的内容
lpop
LPOP key [count](redis 6.2版本及其以上支持这个count,一次pop多个)//从 list 左侧取出元素(即头删)
//时间复杂度:O(1)
//返回值:取出的元素或者 nil
rpop
RPOP key [count](redis 6.2版本及其以上支持这个count,一次pop多个)//从 list 右侧取出元素(即尾删)
//时间复杂度:O(1)
//返回值:取出的元素或者 nil
lindex
LINDEX key index//获取从左数第 index 位置的元素
//时间复杂度:O(N)
//返回值:取出的元素或者 nil
linsert
LINSERT key <BEFORE | AFTER> pivot element//在特定位置插⼊元素 , before和after选一个,在privot之前插入,或者之后插入,这个pivot是元素的值,不是下标
//时间复杂度:O(N)
//返回值:插⼊后的 list ⻓度
llen
LLEN key//获取 list ⻓度
//时间复杂度:O(1)
//返回值:list 的⻓度
lrem
LREM key count element//指定一个元素精准删除//count为要删除的个数,element为要删除的值
//count>0,从左往右删除element两次
//count<0,从右往左删除element两次
//count=0,删除所有的element
ltrim key start stop
LTRIM key start stop//保留start和stop之间的元素(区间外两边的元素就直接被删除了)
//时间复杂度O(n)
lset
LSET key index element//根据下标修改元素
//时间复杂度O(n)
阻塞版本命令

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

  • 在列表中有元素的情况下,阻塞和非阻塞表现是⼀致的。但如果列表中没有元素,非阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态
  • 命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有⼀个键对应的列表中可以弹出元素,命令立即返回
  • 如果多个客⼾端同时多⼀个键执⾏ pop,则最先执⾏命令的客⼾端会得到弹出的元素

redis中的list也相当于阻塞队列一样,线程安全是通过单线程模型支持的,阻塞。则只支持队列为空的情况,不考虑队列满

blpop和brpop都是可以同时去尝试多个key的列表的元素的,多个key对应多个list,这多个list哪个有元素了,就会返哪个元素

blpop
BLPOP key [key ...] timeout//LPOP 的阻塞版本
//时间复杂度:O(1)
//返回值:取出的元素或者 nil
brpop
BRPOP key [key ...] timeout//RPOP 的阻塞版本
//时间复杂度:O(1)
//返回值:取出的元素或者 nil
list的编码方式

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

  1. ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的长度都小于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选用 ziplist 来作为列表的内部编码实现来减少内存消耗。。
  2. linkedlist(链表):当列表类型无法满足 ziplist 的条件时,Redis 会使⽤ linkedlist 作为列表的内 部实现。
list的应用

消息队列

**微博 Timeline

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

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

相关文章

QT5实现https的post请求(QNetworkAccessManager、QNetworkRequest和QNetworkReply)

QT5实现https的post请求 前言一、一定要有sslErrors处理1、问题经过2、代码示例 二、要利用抓包工具1、问题经过2、wireshark的使用3、利用wireshark查看服务器地址4、利用wireshark查看自己构建的请求报文 三、返回数据只能读一次1、问题描述2、部分代码 总结 前言 QNetworkA…

【Go】使用Goland创建第一个Go项目

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Vue组件:模板引用ref属性的使用

Vue 组件系列文章&#xff1a; 《Vue组件&#xff1a;创建组件、注册组件、使用组件》 《Vue组件&#xff1a;使用Prop实现父组件向子组件传递数据》 《Vue组件&#xff1a;使用$emit()方法监听子组件事件》 《Vue组件&#xff1a;插槽》 《Vue组件&#xff1a;混入》 《Vue组件…

无头服务(Headless Service)

无头服务 ​ 无头服务&#xff08;Headless Service&#xff09;是 Kubernetes 中的一种特殊服务类型&#xff0c;主要用于提供稳定的网络标识&#xff0c;而不需要通过负载均衡来分配流量。它允许直接访问 Pod&#xff0c;而不经过集群内的负载均衡器&#xff0c;并且通常用于…

Redis常用操作及springboot整合redis

1. Redis和Mysql的区别 数据模型&#xff1a;二者都是数据库,但是不同的是mysql是进行存储到磁盘当中,而Redis是进行存储到内存中. 数据模型 : mysql的存储的形式是二维表而Redis是通过key-value键值对的形式进行存储数据. 实际的应用的场景: Redis适合于需要快速读写的场景&…

FreeRTOS学习笔记(二)任务基础篇

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2…

python安装包的三种区别

python安装包的三种区别&#xff1a; Download Windows x86 web-based installer Download Windows x86 executable installerDownload Windows x86 embeddable zip fileDownload Windows x86-64 web-based installerDownload Windows x86-64 executable installerDownload W…

使用mingw64 编译 QT开发流程

1. 安装QT5 QT5.12.12 安装时选择mingw的开发包 2. 使用qtdesigner 进行ui设计 生成ui文件 3. 将ui文件转换为.h 文件 uic mywindow.ui -o ui_mywindow.h代码中指向生成的 UI 对象的地方 要改成这个Form 4. 编译 创建mainwindow.cpp #include "mainwindow.h"…

Python Flask_APScheduler定时任务的正确(最佳)使用

描述 APScheduler基于Quartz的一个Python定时任务框架&#xff0c;实现了Quartz的所有功能。最近使用Flask框架使用Flask_APScheduler来做定时任务&#xff0c;在使用过程当中也遇到很多问题&#xff0c;例如在定时任务调用的方法中需要用到flask的app.app_context()时&#…

绍兴视角下的广州温暖:星贝育园——自闭症儿童的关怀之家

在绍兴这座充满人文情怀的城市里&#xff0c;人们对自闭症儿童的关注与关怀如同涓涓细流&#xff0c;汇聚成爱的海洋。当谈及为这些特殊孩子寻找一个温馨、专业的成长环境时&#xff0c;广州的星贝育园自闭症儿童寄宿制学校无疑是众多家庭心中的理想之选。这所学校以其独特的关…

代码随想录Day 42|leetcode题目:188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一&#xff1a;188.买卖股票的最佳时机IV解题思路&#xff1a; 题目二&#xff1a;309.最佳买卖股票时机含冷冻期解题思路&#xff1a; 题目三&#xff1a; 714.买卖股票的最佳时机含手续…

摊牌了!一文教会你轻松上手豆包MarsCode 编程助手!

豆包MarsCode 编程助手是豆包旗下的 AI 编程助手&#xff0c;提供以智能代码补全为代表的 AI 功能。豆包MarsCode 编程助手支持主流的编程语言和 IDE&#xff0c;在开发过程中提供单行代码或整个函数的编写建议。此外&#xff0c;它还支持代码解释、单测生成和问题修复等功能&a…

有关采用parallelStream并行流处理List并使用自定义线程池和lettuce redis客户端一起使用的问题

在使用parallelStream进行处理list时&#xff0c;如不指定线程池&#xff0c;默认的并行度采用cpu核数进行并行&#xff0c;这里采用ForJoinPool来指定线程池&#xff0c;但循环中使用了luttuce 来获取redis的key时&#xff0c;出现没有控制住线程池的线程数问题。具体上代码。…

SAP B1 学习笔记 - 易混淆字段名(持续更新中)

背景 在 SAP B1 的单据中&#xff0c;由于同一单据时常对应着多个后台表单&#xff0c;且后台表单内包含的字段信息往往远大于单据显示出来的&#xff0c;在配置时经常出现多个字段混淆、无系统信息提示字段名模糊的情况&#xff0c;这里总结常见的易混淆难查找的后台字段名。…

AIGC6: 走进腾讯数字盛会

图中是一个程序员&#xff0c;去参加一个技术盛会。AI大潮下&#xff0c;五颜六色&#xff0c;各种不确定。 背景 AI对各行各业的冲击越来越大&#xff0c;身处职场的我也能清晰的感受到。 我所在的行业为全球客服外包行业。 业务模式为&#xff1a; 为国际跨境公司提供不同…

使用C++编写一个语音播报时钟(Qt)

要求&#xff1a;当系统时间达到输入的时间时&#xff0c;语音播报对话框中的内容。定时可以取消。qt界面如上图所示。组件如下&#xff1a; countdownEdit作为书写目标时间的line_edit start_btn作为开始和停止的按钮 stop_btn作为取消的按钮 systimelab显示系统时间的lab tex…

Java后端程序员简单操作Linux系统命令

Linux系统概述 Linux 内核最初是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上 学时而编写的一个开源的操作系统。 Linux&#xff08;管理计算机硬件资源&#xff0c;任务调度&#xff09;支持多用户&#xff0c;支持网络&#xff0c;支持多线…

Vue3:el-table实现日期的格式化

后端如果返回的是时间戳&#xff0c;需要我们进行日期格式化 例如&#xff1a;2024-09-11T14:19:14 定义一个日期解析的工具组件 export function formatDateAsYYYYMMDDHHMMSS(dateStr: any) {const date new Date(dateStr);const year date.getFullYear();const month S…

踩最深的坑,教会自己找到需求

目录 引言 1. 寻找合适的需求 2. 海外市场选择 3. 线下热点判断 4. 线上关注度分析 5. 当前竞争分析 6. 未来潜力分析 引言 在经历了刻骨铭心的合伙创业经历后&#xff0c;我意识到是时候该独立出海了。 捡起早已深埋在心里的创业想法&#xff0c;开始独自创业。 这次…

[笔记] 电机工作制以及软硬特性的本质推导

原始资料来源&#xff1a;某电机厂商 1.电机非常规操作术语和许可次数 1.1 电机操作术语 点动&#xff1a;通电后立即关停&#xff0c;最终速度不到额定转速的1/4电制动&#xff1a;制动到额定转速的1/3逆转&#xff1a;也就是打反车&#xff0c;不等停车&#xff0c;立即翻…