[Redis][List]详细讲解

news2024/11/13 23:35:14

目录

  • 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.coloradmin.cn/o/2154864.html

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

相关文章

yolov8旋转目标检测之绝缘子检测-从数据加载到模型训练、部署

YOLOv8 是 YOLO (You Only Look Once) 系列目标检测算法的最新版本&#xff0c;以其高速度和高精度而著称。在电力行业中&#xff0c;绝缘子是电力传输线路上的重要组件之一&#xff0c;它们用于支撑导线并保持电气绝缘。由于长期暴露在户外环境中&#xff0c;绝缘子容易出现损…

详细分析Spring的动态代理机制

文章目录 1. JDK动态代理和CGLIB动态代理的区别1.1 适用范围1.2 生成的代理类1.3 调用方式 2. 问题引入3. 创建工程验证 Spring 默认采用的动态代理机制3.1 引入 Maven 依赖3.2 UserController.java3.3 UserService.java3.4 UserServiceImpl.java&#xff08;save方法添加了Tra…

【Python】探索 TensorFlow:构建强大的机器学习模型

TensorFlow 是一个开源的深度学习框架&#xff0c;由 Google 开发&#xff0c;广泛应用于机器学习和人工智能领域。自从 2015 年推出以来&#xff0c;它已成为研究人员、开发者和数据科学家们不可或缺的工具。TensorFlow 提供了灵活、高效的工具集&#xff0c;可以帮助我们构建…

API接口在金融科技领域的创新应用

导语&#xff1a; 随着互联网的发展和技术的进步&#xff0c;API接口在金融科技领域的创新应用越来越受到关注。本文将介绍API接口的基本概念&#xff0c;以及它在金融科技领域的应用案例。 第一部分&#xff1a;API接口简介及原理 API是Application Programming Interface&…

2021-03-03人工智能应用的就业效应

【摘要】文章从人工智能的概念出发&#xff0c;在总结已有研究方法的基础上&#xff0c;回顾了人工智能对就业的产业分布、岗位、工资等方面影响的理论与实证研究。文章发现&#xff0c;人工智能技术在替代部分岗位、促使劳动力在不同产业间流动的同时&#xff0c;还会加快劳动…

java 获取集合a比集合b多出来的对象元素

public class OrderListEntity {/*** deprecated 对象集合的处理* param aData 集合a* param bData 集合b* return 返回集合a比集合b多出来的部分, 通过id判断*/public static List<OrderListEntity> AHasMoreThanBData(List<OrderListEntity> aData, List<Ord…

LEAN 赋型唯一性(Unique Typing)之 Church-Rosser 定理 (Church-Rosser Theorem)及 赋型唯一性的证明

有了并行K简化的概念及其属性&#xff0c;以及其在LEAN类型理论中的相关证明&#xff0c;就可以证明&#xff0c;在K简化下的Church-Rosser 定理。即&#xff1a; 其过程如下&#xff1a; 证明如下&#xff1a; 其中的 lemma 4.9 和 4.10 &#xff0c;及 4.8 是 这整个证明过程…

华为云centos7.9按装ambari 2.7.5 hostname 踩坑记录

华为云centos7.9按装ambari 2.7.5踩坑记录 前言升华总结 前言 一般都是废话&#xff0c;本人专业写bug业余运维。起初找了三台不废弃的台式机&#xff0c;开始重装centos系统&#xff0c;开始了HDP3.1.5Ambari2.7.5安装。 推荐一波好文&#xff0c;一路长绿。跑了一段时间没啥…

2024年最新版TypeScript学习笔记——泛型、接口、枚举、自定义类型等知识点

今天带来的是来自尚硅谷禹神2024年8月最新的TS课程的学习笔记&#xff0c;不得不说禹神讲的是真的超级棒&#xff01; 文章目录 TS入门JS中的困扰静态类型检查编译TS命令行编译自动化编译 类型检查变量和函数类型检查字面量类型检查 类型推断类型声明声明对象类型声明函数类型…

深度学习02-pytorch-08-自动微分模块

​​​​​​​ 其实自动微分模块&#xff0c;就是求相当于机器学习中的线性回归损失函数的导数。就是求梯度。 反向传播的目的&#xff1a; 更新参数&#xff0c; 所以会使用到自动微分模块。 神经网络传输的数据都是 float32 类型。 案例1: 代码功能概述&#xff1a; 该…

【Python篇】深入机器学习核心:XGBoost 从入门到实战

文章目录 XGBoost 完整学习指南&#xff1a;从零开始掌握梯度提升1. 前言2. 什么是XGBoost&#xff1f;2.1 梯度提升简介 3. 安装 XGBoost4. 数据准备4.1 加载数据4.2 数据集划分 5. XGBoost 基础操作5.1 转换为 DMatrix 格式5.2 设置参数5.3 模型训练5.4 预测 6. 模型评估7. 超…

重生之我们在ES顶端相遇第14 章 - ES 节点类型

文章目录 前言Coordinating nodeMaster-eligible nodeData nodeCoordinating only nodeRemote-eligible nodeMachine learning node 前言 通过前面的学习&#xff0c;我们已经初步的掌握了 ES 的大部分用法。 后面的篇章会介绍 ES 集群相关的内容。 本文着重介绍 ES 节点类型&…

华为HarmonyOS地图服务 3 - 如何开启和展示“我的位置”?

一. 场景介绍 本章节将向您介绍如何开启和展示“我的位置”功能&#xff0c;“我的位置”指的是进入地图后点击“我的位置”显示当前位置点的功能。效果如下&#xff1a; 二. 接口说明 “我的位置”功能主要由MapComponentController的方法实现&#xff0c;更多接口及使用方法…

软考高级:逻辑地址和物理地址转换 AI解读

一、题目 设某进程的段表如下所示&#xff0c;逻辑地址&#xff08; &#xff09;可以转换为对应的物理地址。 A. &#xff08;0&#xff0c;1597&#xff09;、&#xff08;1&#xff0c;30&#xff09;和&#xff08;3&#xff0c;1390&#xff09; B. &#xff08;0&…

Vue3 中组件传递 + css 变量的组合

文章目录 需求效果如下图所示代码逻辑代码参考 需求 开发一个箭头组件&#xff0c;根据父组件传递的 props 来修改 css 的颜色 效果如下图所示 代码逻辑 代码 父组件&#xff1a; <Arrow color"red" />子组件&#xff1a; <template><div class&…

3DMAX乐高积木插件LegoBlocks使用方法

3DMAX乐高积木插件LegoBlocks&#xff0c;用户可以通过控件调整和自定义每个乐高积木的外观和大小。 【适用版本】 3dMax2009或更高版本&#xff08;不仅限于此范围&#xff09; 【安装方法】 3DMAX乐高积木插件无需安装&#xff0c;使用时直接拖动插件脚本文件到3dMax视口中…

TS 运行环境

1、TS Playground&#xff08;在线&#xff09; TS Playground 是一个在线 TypeScript 编辑器&#xff0c;它允许你编写、共享和学习 TypeScript 代码。 2、Stackblitz&#xff08;在线&#xff09; StackBlitz 是面向web开发人员的基于浏览器的协作IDE。StackBlitz消除了耗时…

握手传输 状态机序列检测(记忆科技笔试题)_2024年9月2日

发送模块循环发送0-7&#xff0c;在每个数据传输完成后&#xff0c;间隔5个clk&#xff0c;发送下一个 插入寄存器打拍处理&#xff0c;可以在不同的时钟周期内对信号进行同步&#xff0c;从而减少亚稳态的风险。 记忆科技笔试题&#xff1a;检测出11011在下一个时钟周期输出…

Python | 读取.dat 文件

写在前面 使用matlab可以输出为 .dat 或者 .mat 形式的文件&#xff0c;之前介绍过读取 .mat 后缀文件&#xff0c;今天正好把 .dat 的读取也记录一下。 读取方法 这里可以使用pandas库将其作为一个dataframe的形式读取进python&#xff0c;数据内容格式如下&#xff0c;根据…

VulnHub-Narak靶机笔记

Narak靶机笔记 概述 Narak是一台Vulnhub的靶机&#xff0c;其中有简单的tftp和webdav的利用&#xff0c;以及motd文件的一些知识 靶机地址&#xff1a; https://pan.baidu.com/s/1PbPrGJQHxsvGYrAN1k1New?pwda7kv 提取码: a7kv 当然你也可以去Vulnhub官网下载 一、nmap扫…