Redis命令——list

列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素(element),⼀个列表最多可以存储个元素
在 Redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等。列表是⼀种比较灵活的数据结构,它可以充当栈和队列的角色
列表(list)相当于是 数组 或者 顺序表
list 内部编码方式并非是一个简单的数组,而是更接近于“双端队列”(deque)
列表中的元素是有序的(元素位置),允许插入重复元素

常见命令

1)lpush  lpushx  rpush  rpushx

lpush key element [element ...]                                                  —— 头插

返回 list 的长度  O(1)

lpushx key element [element ...]

当 key 存在是返回 list 的长度,否则直接返回  O(1)                  —— 头插

rpush key element [element ...]                                                  —— 尾插

返回 list 的长度  O(1)

rpush key element [element ...]                                                  —— 尾插

当 key 存在是返回 list 的长度,否则直接返回  O(1) 

若果 key 已经存在,并且 key 对应的 value 类型不是 list,此时会报错

2)lrange

获取从 start 到 end 区间内的所有元素(左闭右闭)

lrange key start end  (支持负数)

返回指点区间内的元素  O(N)

此处 数字 只是标识返回元素的顺序(结果集),和下标无关

当给出非法下标时,Redis 会尽可能的取到给定区间内的元素(鲁棒性)

3)lpop  rpop

lpop key [count]                                                       —— 头删

返回指定区间内的元素或者 nil  O(count)

rpop key [count]                                                       —— 尾删

返回指定区间内的元素或者 nil  O(count)

Redis 中的 list 是一个双端队列,从两头插入/删除是非常高效的  O(1)

rpush + lpop ——> 队列

rpush + rpop ——> 栈

4)lindex

lindex key index

返回指定下表的元素 ,非法下标则返回 nil  O(N)

正数表示从左数,负数反之,起始点为 0

5)linsert

linsert key <before | after> pivot element

返回插入后的 list 的长度  O(N)

pivot  基准值(从左往右)    element  要插入的元素

6)len

len key

返回 list 的长度  O(1)

7)lrem

lrem key count element

返回删除的元素个数  O(1)

count  要删除的元素的个数       element  要删除的元素的值

8)ltrim 

ltrim key count element

返回 ok  O(N)

保留 start 和 stop 区间内的元素(区间外的被直接删除)

9)lset

lset key index element

返回 OK,若下表越界返回 nil  O(1)

10)blpop  brpop

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

blpop key [key ...] timeout                   —— 尾删

返回取出的元素或者 nil  O(1)

brpop key [key ...] timeout                   —— 尾删

返回取出的元素或者 nil  O(1)

返回结果相当于是一个pair(二元组)

一方面表示当前数据来自哪个 key          

一方面表示取到的数据是什么

生产者—消费者模型  —— BlockingQueue

使用队列作为中间的“交易场所”(broker)

1.线程安全

2.队列为空,尝试出队列,产生阻塞,直到队列不空,阻塞解除

   队列为满,尝试入队列,产生阻塞,直到队列不满,阻塞解除

Redis 的 list 也相当于 阻塞队列

线程安全 —— 单线程模型        阻塞 —— 只支持“队列为空”,不考虑“队列满”

显示设置阻塞时间,此处不会对 Redis 服务器造成太大影响

可以同时去尝试获取多个键,一旦有一个键对应的列表中可以弹出元素,命令立即返回

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

如果多个客户端同时对一个键进行 blpop ,最先执行的客户端会获得元素

编码方式

quecklist

相当于是 链表 和 压缩列表 的结合

整体还是一个列表,链表的每个节点,是一个压缩列表

每个压缩列表都不太大,同时再把多个压缩列表通过链表结构连起来

ziplist(压缩列表)

把数据按照更紧凑的形式进行表示。

节省空间,但是数个数多了,操作效率会下降

linkedlist(链表)

应用场景

消息队列

使用 lpush + brpop 组合实现 生产者-消费者 模型,在通过多个客户端保证负载均衡和高可用性

如果列表为空,生产出的下个元素只有一个消费者可以“抢到”元素

分频道的消息队列

如果频道为空,生产出的下个元素只有一个消费者可以“抢到”元素

多个频道,可以在某种数据发生异常时,不会对其他数据造影响(解耦合)

微博 TimeLine

每个用户都有属于自己的 TimeLine(微博列表)

当需要分页展示文章列表时,可以使用 list (list不仅有序,还支持按照索引范围获取元素)

1.)当前一页中的有多少数据是不确定的,可能会导致下面的循环比较大,从而出发多次 hgetall(多次网络请求)

pipeline (流水线\管道)把多个 Redis 命令合并成一次 网络请求进行通信,降低服务器与客户端的通信次数

2)分裂获取文章时,lrange 在列表两端表现比较好,获取列表中间的元素表现比较差,可以将列表进行拆分

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

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

相关文章

Android Jetpack Compose 状态管理解析:remember vs mutableStateOf,有啥不一样?为啥要一起用?

&#x1f331;《Jetpack Compose 状态管理解析&#xff1a;remember vs mutableStateOf&#xff0c;有啥不一样&#xff1f;为啥要一起用&#xff1f;》 在 Jetpack Compose 的世界里&#xff0c;UI 是响应式的。这意味着当状态发生变化时&#xff0c;UI 会自动重组&#xff0…

使用 PCL 和 Qt 实现点云可视化与交互

下面我将介绍如何结合点云库(PCL)和Qt框架(特别是QML)来实现点云的可视化与交互功能&#xff0c;包括高亮选择等效果。 1. 基本架构设计 首先需要建立一个结合PCL和Qt的基本架构&#xff1a; // PCLQtViewer.h #pragma once#include <QObject> #include <pcl/point…

mybatis plus打印sql日志到指定目录

1、mybatis plus打印sql日志 参考文档&#xff1a;mybatis plus打印sql日志_mybatisplus日志打印-CSDN博客 2、修改 修改InfoLevelLogger Override public void debug(String s) {// 修改这里logger.info(s);log.debug(s); } 增加&#xff1a;log.debug(s); 修改logback.x…

vue3 watch和watchEffect 的用法和区别

在 Vue 3 里&#xff0c;watch 和 watchEffect 都是用于响应式数据变化的 API&#xff0c;但它们在使用方法和应用场景上存在差异。下面详细介绍它们的用法和区别。 用法 watch watch 用于监听特定的响应式数据源&#xff0c;当数据源发生变化时&#xff0c;会执行相应的回调…

Qt中修改了UI设计文件后编译不生效问题的解决办法

复制工程过来后&#xff1a; 1、删除build文件 2、删除.user文件&#xff0c;恢复为文件最初的那样 3、执行make distclean,删除所有由先前构建过程生成的文件 4、再次打开工程&#xff0c;修改ui文件编译生效&#xff01;

EtherCAT转ProfiNet边缘计算网关配置优化:汽车制造场景下PLC与机器人协同作业案例

1.行业背景与需求分析 智能汽车焊装车间是汽车制造的核心工艺环节&#xff0c;某德国豪华品牌在其上海MEB工厂新建的焊装车间中&#xff0c;采用西门子S7-1500PLC作为ProfiNet主站&#xff0c;负责整线协调与质量追溯&#xff1b;同时部署KUKAKR1500Titan机器人&#xff08;Eth…

day46—双指针-两数之和-输入有序数组(LeetCode-167)

题目描述 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 &l…

线性代数 | 知识点整理 Ref 1

注&#xff1a;本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载&#xff0c;本篇为 Ref 1。 略作重排&#xff0c;未整理去重。 图片清晰度限于引文原状。 如有内容异常&#xff0c;请看原文。 线性代数知识汇总 Arrow 于 2016-11-27 16:27:5…

比特币的跨输入签名聚合(Cross-Input Signature Aggregation,CISA)

1. 引言 2024 年&#xff0c;人权基金会&#xff08;Human Rights Foundation&#xff0c;简称 HRF&#xff09;启动了一项研究奖学金计划&#xff0c;旨在探讨“跨输入签名聚合”&#xff08;Cross-Input Signature Aggregation&#xff0c;简称 CISA&#xff09;的潜在影响。…

3.基础开发工具

1.软件包管理器 1.1什么是软件包 • 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序. • 但是这样太⿇烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上, 通过包管理器可以很…

Golang errors 包快速上手

文章目录 1.变量2.类型3.函数3.1 New3.2 Is简介函数签名核心功能示例代码使用场景注意事项小结 3.3 As简介函数签名核心功能示例代码使用场景注意事项小结 3.4 Unwrap简介函数签名核心功能使用示例使用场景注意事项小结 3.5 Join简介函数签名核心功能使用场景注意事项小结 4.小…

Java File 类详解

Java File 类详解 File 类是 Java 中用于表示文件和目录路径名的抽象类&#xff0c;位于 java.io 包中。它提供了丰富的 API&#xff0c;用于操作文件系统&#xff0c;包括创建、删除、重命名、查询文件属性等功能。 1. File 类核心知识点 &#xff08;1&#xff09;构造方法…

基于javaweb的SpringBoot儿童爱心管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

Unity Nav Mesh导航系统的简单使用

标题 1.下载。2.面板位置3.object面板4.Area面板5.Bake面板6.Agent面板7.Nav Mesh Agent组件8.Nav Mesh Obstacle组件9.简单使用 1.下载。 unity2022以上版本要去packageManager中下载。 2.面板位置 3.object面板 Navigation Static&#xff1a;设置该物体是否被列入静态寻路…

FairyGUI图标文字合批失败的原因

1&#xff09;FairyGUI图标文字合批失败的原因 2&#xff09;为什么Cubemap的内存占用超高 3&#xff09;如何找到网格某个切面的中心点 4&#xff09;为什么SafeZone在倒屏后方向相反 这是第428篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了…

[BUG]Cursor C++扩展不支持

本文内容组织形式 问题描述失效原因解决方案使用野版C Extension 猜你喜欢结语 问题描述 日期&#xff1a;20250419 操作系统&#xff1a; mac C代码没有办法进行跳转&#xff0c;并且和以前的文本标亮也不同 并且还有如下问题弹窗 C/C 扩展只能与 Microsoft Visual Studio…

深⼊理解 JVM 执⾏引擎

深⼊理解 JVM 执⾏引擎 其中前端编译是在 JVM 虚拟机之外执⾏&#xff0c;所以与 JVM 虚拟机没有太⼤的关系。任何编程语⾔&#xff0c;只要能够编译出 满⾜ JVM 规范的 Class ⽂件&#xff0c;就可以提交到 JVM 虚拟机执⾏。⾄于编译的过程&#xff0c;如果你不是想要专⻔去研…

Ubuntu 部署 DeepSeek

在 Ubuntu 系统上部署 DeepSeek 模型&#xff0c;能让用户利用其强大的人工智能能力&#xff0c;同时保障数据的安全性与操作的自主性。不过&#xff0c;这一过程涉及诸多技术细节&#xff0c;需要谨慎操作。以下将为你详细介绍在 Ubuntu 系统部署 DeepSeek 的操作步骤及注意事…

通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等

通义灵码新上的外挂 Project Rules 获得了开发者的一致好评&#xff1a;最小成本适配我的开发风格、相当把团队经验沉淀下来&#xff0c;是个很好功能…… 那么有哪些现成的 Rules 可以抄作业呢&#xff0c;今天我们官方输出了 Java、TypeScript、Python、Go、JavaScript 等语…

山东大学软件学院项目实训-基于大模型的模拟面试系统-Token过期重定向问题

项目结构 ├── assets/ # 静态资源&#xff08;CSS/图片&#xff09; ├── components/ # Vue 组件 ├── layouts/ # 布局模板 ├── pages/ # 自动生成路由 ├── plugins/ # 插件&#xff08;如 axios 拦截器&#xff09; …