[Redis][List]详细讲解

目录

  • 0.前言
  • 1.常用命令
    • 1.LPUSH / RPUSH
    • 2.LPUSHX / RPUSHX
    • 3.LRANGE
    • 4.LPOP / RPOP
    • 5.LINDEX
    • 6.LINSERT
    • 7.LLEN
    • 8.LREM
    • 9.LTRIM
    • 10.LSET
  • 2.阻塞版本命令
    • 0.是什么?
    • 1.BLPOP / BRPOP
  • 3.内部编码(旧版本,仅供参考)
    • 1.ziplist(压缩链表)
    • 2.linkedlist(链表)
    • 3.quicklist(快速链表) -> (现行方案)
  • 4.使用场景
    • 1.消息队列
    • 2.分频道的消息队列
    • 3.微博 Timeline


0.前言

  • 列表类型是⽤来存储多个有序的字符串,相当于数组/顺序表

    • 内部实现类似于”双端队列“(deque)
  • 列表中的每个字符串称为元素(element),⼀个列表最多可以存储 2 32 − 1 2^{32} - 1 2321个元素

  • 在Redis中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等
    请添加图片描述

    请添加图片描述

  • 列表是⼀种⽐较灵活的数据结构,它可以充当栈和队列的⻆⾊,在实际开发上有很多应⽤场景

  • 列表类型的特点

    • 列表中的元素是有序的:这意味着可以通过索引下标获取某个元素或者某个范围的元素列表
    • 区分获取和删除的区别rem是删除,会导致列表的长度改变,index是获取元素,列表长度不会变化
    • 列表中的元素是允许重复的,而hash这样的类型,field是不能重复的
      请添加图片描述

1.常用命令

1.LPUSH / RPUSH

  • 功能:将一个或者多个元素从左侧(头插) / 右侧(尾插)放入到list
    • 注意:是按照键入在命令中的顺序,从左向右将命令中的元素插入到list中的
      • 例如LPUSH key 1 2 3 4,那么最后list呈现的结果为:4 3 2 1
  • 语法LPUSH/RPUSH key element [element ...]
  • 返回值:插入后list的长度
  • 时间复杂度:只插入一个元素为 O ( 1 ) O(1) O(1),插入多个元素为 O ( N ) O(N) O(N),N为插入元素个数

2.LPUSHX / RPUSHX

  • 功能:在key存在时,将⼀个或者多个元素从左侧(头插) / 右侧(尾插)放⼊到list中,不存在,直接返回
  • 语法LPUSHX/RPUSHX key element [element ...]
  • 返回值:插入后list的长度
  • 时间复杂度:只插入一个元素为 O ( 1 ) O(1) O(1),插入多个元素为 O ( N ) O(N) O(N),N为插入元素个数

3.LRANGE

  • 功能:获取从startend区间的所有元素,左闭右闭,下标支持负数
  • 语法LRANGE key start stop
  • 返回值:指定区间的元素
  • 时间复杂度 O ( N ) O(N) O(N)
  • 注意:Redis会尽可能地获取到给定区间的元素,如果给定区间非法,比如超出下标,就会尽可能地获取到对应的内容
    • Redis对于下标越界地处理方式类似于Python的切片操作

4.LPOP / RPOP

  • 功能:从list左侧取出元素(头删) / 右侧取出元素(尾删)
  • 语法LPOP/RPOP key
  • 返回值:取出的元素或者nil
  • 时间复杂度 O ( 1 ) O(1) O(1)

5.LINDEX

  • 功能:获取从左数第index位置的元素
  • 语法LINDEX key index
  • 返回值:取出的元素或者nil
  • 时间复杂度 O ( N ) O(N) O(N)

6.LINSERT

  • 功能:在特定位置插入元素
  • 语法LINSERT key <BEFORE | AFTER> pivot element
  • 返回值:插入后的list长度
  • 时间复杂度 O ( N ) O(N) O(N),N表示列表的长度
  • 注意LINSERT进行插入的时候,要根据基准值,找到对应的位置,从左往右找,找到第一个符合基准值的位置即可

7.LLEN

  • 功能:获取list长度
  • 语法LLEN key
  • 返回值list的长度
  • 时间复杂度 O ( 1 ) O(1) O(1)

8.LREM

  • 功能:删除元素
  • 语法LREM key count element
    • count:要删除的个数
      • count > 0:从头向尾删
      • count < 0:从尾向头删
      • count = 0:删除全部元素
    • element:要删除的值
  • 返回值:删除元素的个数
  • 时间复杂度 O ( N + M ) O(N + M) O(N+M),N为list的长度,M为要删除元素的个数

9.LTRIM

  • 功能:保留[start, stop区间内的元素,区间外面的元素就直接被删除了
  • 语法LTRIM key start stop
  • 时间复杂度 O ( N ) O(N) O(N),N为要删除元素的个数

10.LSET

  • 功能:根据下标,修改元素
  • 语法LSET key index element
  • 时间复杂度 O ( N ) O(N) O(N)

2.阻塞版本命令

0.是什么?

  • blpopbrpoplpoprpop的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致,除了
    • 在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的
      • 但如果列表中没有元素,⾮阻塞版本会立即返回nil
      • 但阻塞版本会根据timeout,阻塞⼀段时间,期间Redis可以执⾏其他命令,但要求执 ⾏该命令的客⼾端会表现为阻塞状态
    • 命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有⼀个键对应的列表中可以弹出元素,命令⽴即返回
    • 如果多个客⼾端同时对⼀个键执⾏pop,则最先执⾏命令的客⼾端会得到弹出的元素
  • 阻塞版本的blpop和非阻塞版本lpop的区别
    • 列表不为空时
      请添加图片描述

    • 列表为空时,且5秒内没有新元素加入
      请添加图片描述

    • 列表为空时,且5秒内有新元素加入
      请添加图片描述


1.BLPOP / BRPOP

  • 功能LPOP / RPOP的阻塞版本
  • 语法:`BLPOP/BRPOP key [key …] timeout
  • 返回值:取出的元素或者nil
  • 时间复杂度 O ( 1 ) O(1) O(1)

3.内部编码(旧版本,仅供参考)

1.ziplist(压缩链表)

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

2.linkedlist(链表)

  • 当列表类型⽆法满⾜ziplist的条件时,Redis会使⽤linkedlist作为列表的内部实现

3.quicklist(快速链表) -> (现行方案)

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

4.使用场景

1.消息队列

  • Redis可以使⽤lpush + brpop命令组合实现经典的阻塞式⽣产者-消费者模型队列, ⽣产者客⼾端使⽤lpush从列表左侧插⼊元素,多个消费者客⼾端使⽤brpop命令阻塞式地从队列中 "争抢"队⾸元素。通过多个客⼾端来保证消费的负载均衡和⾼可⽤性
    请添加图片描述

2.分频道的消息队列

  • Redis同样使⽤lpush + brpop命令,但**通过不同的键模拟频道的概念,不同的消费者可以通过brpop不同的键值,实现订阅不同频道的理念**
    请添加图片描述

3.微博 Timeline

  • 每个⽤⼾都有属于⾃⼰的Timeline(微博列表),现需要分⻚展⽰⽂章列表。此时可以考虑使⽤列表,因为列表不但是有序的,同时⽀持按照索引范围获取元素
  • 每篇微博使⽤哈希结构存储,例如微博中3个属性:title、timestamp、content
    hmset mblog:1 title xx timestamp 1476536196 content xxxxx
    ...
    hmset mblog:n title xx timestamp 1476536196 content xxxxx
    
  • 向⽤⼾Timeline添加微博,user::mblogs作为微博的键
    lpush user:1:mblogs mblog:1 mblog:3
    ...
    lpush user:k:mblogs mblog:9
    
  • 分⻚获取⽤⼾的Timeline,例如获取⽤⼾1的前10篇微博
    keylist = lrange user:1:mblogs 0 9
    for key in keylist
    {hgetall key
    }
    
  • 此⽅案在实际中可能存在两个问题
    • 1+n问题:如果每次分⻚获取的微博个数较多,需要执⾏多次hgetall操作,此时可以考虑使⽤pipeline(流⽔线)模式批量提交命令,或者微博不采⽤哈希类型,⽽是使⽤序列化的字符串类型,使⽤mget获取
    • 分裂获取⽂章时,lrange在列表两端表现较好,获取列表中间的元素表现较差,此时可以考虑将列表做拆分

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

TK72A12N1 N沟道功率MOSFET 工业控制领域的高性能功率开关

TK72A12N1产品特性&#xff1a; 漏源电压&#xff08;Vdss&#xff09;&#xff1a;120V&#xff0c;这意味着该器件在正常工作时&#xff0c;漏极和源极之间所能承受的最大电压为 120V。如果超过这个电压&#xff0c;可能会导致器件损坏。 漏极电流&#xff08;Id&#xff0…

基于SpringBoot和Vue框架的医保管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1.研究的主要内容与方法 &#xff08;1&#xff09;主要内容 医保管理系统采用B/S模式进行开发&#xff0c;采用Springboot框架、VUE技术、Idea为环境、MySQL为数据库开发。主要功能有&#xff1a;个人资料管理、投保用户管理、…

C++ 把字符串转换成整数 (atoi) - 力扣(LeetCode)

点击链接即可查看&#xff1a;LCR 192. 把字符串转换成整数 (atoi) - 力扣&#xff08;LeetCode&#xff09; 一、题目 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 my…

剩余参数运算符的babel转义配置

记一次生产构建的报错 uncaught syntaxerror: unexpected token ... 背景 在处理展示markdown文本功能&#xff0c;并且其中的代码高亮功能时&#xff0c;引入了两个第三发的依赖包marked 和 highlight.js &#xff0c;本地功能调试正常之后&#xff0c;一如即往的没有build…

基于51单片机的汽车倒车防撞报警器系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 本课题基于微控制器控制器&#xff0c; 设计一款汽车倒车防撞报警器系统。 要求&#xff1a; 要求&#xff1a;1.配有距离&#xff0c; 用于把车和障碍物之间的距离信号送入控制器。 2.配有报警系…

【漏洞复现】金斗云 HKMP download 任意文件读取漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

[产品管理-32]:NPDP新产品开发 - 30 - 文化、团队与领导力 - 领导力与团队的可持续发展

目录 一、团队领导的领导力 1.1 领导力 1、领导力的定义 2、领导力的重要性 3、领导力的构成要素 4、如何提升领导力 1.2 情商 二、虚拟团队 1、团队定义与特征 2、团队优势 3、团队挑战与应对策略 三、可持续发展 四、团队管理和领导力中的度量指标 4.1 激励创新…

SpringBoot环境配置(Spring Boot Profile)

一、介绍 在Spring Boot中&#xff0c;spring.profiles 配置用于定义不同环境下的配置文件。这使得应用可以在不同的环境中使用不同的配置&#xff0c;比如开发环境、测试环境和生产环境等。这种方式可以避免在代码中硬编码配置信息&#xff0c;并且能够更灵活地管理应用的环境…

深度学习02-pytorch-04-张量的运算函数

在 PyTorch 中&#xff0c;张量&#xff08;tensor&#xff09;运算是核心操作之一&#xff0c;PyTorch 提供了丰富的函数来进行张量运算&#xff0c;包括数学运算、线性代数、索引操作等。以下是常见的张量运算函数及其用途&#xff1a; 1. 基本数学运算 加法运算&#xff1a…

Linux常用命令 笔记

Linux常用指令 查看命令ls 列出指定路径下的文件和目录cd 切换目录绝对路径相对路径 pwd 查看当前路径的绝对路径touch 创建空文件cat 显示文件内容echo 显示内容 & 写入文件vim 文本编辑器打开文件编辑文件保存退出 mkdir 创建目录rm 删除文件&目录删除文件删除目录 定…

TMS320F28335的RS232 通信实验

TMS320F28335 内部含有非常多的通信接口,其中串口是通信接口中应用 非常广泛之一,开发板上集成了一个 RS232 模块,其中串口就是接在 F28335 芯 片的 SCIA 接口。 F28335 通过 SCIA 实现与 PC 机对话,F28335 的 SCIA 收到 PC 机发来的数据后 原封不动的返回给 PC 机显示,定…

【JVM原理】运行时数据区(内存结构)

JVM &#xff08;Java Virtual Machine&#xff09;原理 文章目录 四、运行时数据区&#xff08;内存结构&#xff09;4-1 线程私有区域程序计数器&#xff08;program counter Register&#xff09;本地方法栈&#xff08;Native Method Stacks&#xff09;Java 虚拟机栈&…

【可变模板参数】

文章目录 可变参数模板的概念可变参数模板的定义方式参数包的展开方式递归展开参数包逗号表达式展开参数包 STL容器中的emplace相关接口函数 可变参数模板的概念 可变参数模板是C11新增的最强大的特性之一&#xff0c;它对参数高度泛化&#xff0c;能够让我们创建可以接受可变…

C++ | Leetcode C++题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; class Solution { public:string originalDigits(string s) {unordered_map<char, int> c;for (char ch: s) {c[ch];}vector<int> cnt(10);cnt[0] c[z];cnt[2] c[w];cnt[4] c[u];cnt[6] c[x];cnt[8] c[g];cnt[3] c[h] - …

C++初阶学习——模版进阶

1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成…

GroupMamba: Parameter-Efficient and Accurate Group Visual State Space Model

GroupMamba: Parameter-Efficient and Accurate Group Visual State Space Model 1.介绍2.相关工作3.方法3.1预备知识3.2整体架构3.3调制组Mamba层3.3.1视觉单一选择性扫描&#xff08;Visual Single Selective Scan&#xff0c;简称VSSS&#xff09;块3.3.2分组Mamba操作3.3.3…

Vue 计算属性(computed)的使用和优化

前言 Vue 的计算属性&#xff08;computed&#xff09;是 Vue.js 中非常重要的一个概念。它允许你在 Vue 组件中定义一些计算逻辑&#xff0c;这些逻辑会依赖于 Vue 的响应式数据&#xff0c;并且具有缓存机制&#xff0c;只有在依赖数据发生改变时才会重新计算&#xff0c;从…

蓝桥杯—STM32G431RBT6(ADC数模转换,从原理到应用)

一、什么是ADC&#xff1f; ADC&#xff08;Analog-to-Digital Converter&#xff09;即模数转换器。它是一种将模拟信号转换为数字信号的电子器件。在电子系统中&#xff0c;ADC 起着至关重要的作用&#xff0c;它能将连续变化的模拟量&#xff08;如电压、电流等&#xff09;…

ps学习。

有大量的图要扣&#xff0c;淘宝5-15块扣一个&#xff0c;尽管蛮便宜的&#xff0c;但是架不住量大啊&#xff0c;还是好好ps&#xff0c;也能省一大笔钱。 填充 在这里有个油漆桶&#xff0c;一开始也叫渐变色&#xff0c;堆放在一起了&#xff0c;我觉得这不是个好设计。。…

pycharm 使用 translation 插件通过openai进行翻译

pycharm 使用 translation 插件通过openai进行翻译 1. 安装插件2. 配置插件3. 翻译 1. 安装插件 2. 配置插件 3. 翻译 调用 openai 时使用的提示词如下&#xff1a; <|im_start|>system\nYou are a translation engine that can only translate text and cannot interpr…