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/77162.shtml

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

相关文章

关于Diamond机械手的运动学与动力学的推导

1.关于Diamond机械手 &#xff08;1&#xff09;位置模型推导 逆解&#xff1a;机械末端平台的位置与驱动关节之间的关系。 设p点在xy平面的坐标是&#xff08;x&#xff0c;y&#xff09;T&#xff0c;此时根据向量求解 OP等于向量r等于e向xy轴的向量主动臂长度向xy轴的向量…

如何新建一个空分支(不继承 master 或任何提交)

一、需求分析&#xff1a; 在 Git 中&#xff0c;我们通常通过 git branch 来新建分支&#xff0c;这些分支默认都会继承当前所在分支的提交记录。但有时候我们希望新建一个“完全干净”的分支 —— 没有任何提交&#xff0c;不继承 master 或任何已有内容&#xff0c;这该怎么…

Flask(补充内容)配置SSL 证书 实现 HTTPS 服务

没有加密的http服务&#xff0c;就像在裸泳&#xff0c;钻到水里便将你看个精光。数据在互联网上传输时&#xff0c;如果未经加密&#xff0c;随时可能被抓包软件抓住&#xff0c;里面的cookie、用户名、密码什么的&#xff0c;它会看得一清二楚&#xff0c;所以&#xff0c;只…

云服务器CVM标准型S5实例性能测评——2025腾讯云

腾讯云服务器CVM标准型S5实例具有稳定的计算性能&#xff0c;CPU采用采用 Intel Xeon Cascade Lake 或者 Intel Xeon Cooper Lake 处理器&#xff0c;主频2.5GHz&#xff0c;睿频3.1GHz&#xff0c;CPU内存配置2核2G、2核4G、4核8G、8核16G等配置&#xff0c;公网带宽可选1M、3…

什么是智算中心

智算中心是一种专门为智能计算提供强大算力支持的基础设施&#xff0c;以下是关于它的详细介绍&#xff1a; 定义与功能 智算中心是基于强大的计算能力&#xff0c;特别是针对人工智能算法进行优化的计算中心。它集成了大量的高性能计算设备&#xff0c;如 GPU 集群、FPGA 阵…

注意力机制是如何实现的

注意力机制的实现可以分解为几个核心步骤&#xff0c;其本质是通过动态计算权重&#xff0c;决定不同位置信息的重要性&#xff0c;再对信息进行加权融合。以下从数学原理、代码实现到直观解释逐步展开&#xff1a; 一、核心实现步骤 以最常见的**点积注意力&#xff08;Dot-P…

【裁员感想】

裁员感想 今天忽然感觉很emo 因为知道公司要裁员 年中百分之10 年末百分十10 我知道这个百分20会打到自己 所以还挺不开心的 我就想起 我的一个亲戚当了大学老师 我觉得真的挺好的 又有寒暑假 又不是很累 薪资也不低 又是编制 同时也觉得自己很失败 因为对自己互联网的工作又…

从信号处理角度理解图像处理的滤波函数

目录 1、预备知识 1.1 什么是LTI系统? 1.1.1 首先来看什么是线性系统,前提我们要了解什么是齐次性和叠加性。

目标检测概述

为什么基于卷积网络的目标检测模型在预测后要使用非极大值抑制 基于卷积网络的目标检测模型可能会在目标的相邻区域生成多个相互重叠框&#xff0c;每个框的预测结果都是同一个目标&#xff0c;引起同一目标的重复检测。造成这一现象的原因主要有两个&#xff0c; 基于卷积网络…

【JAVA】在idea新加artifact时,点击Build-Build Artifacts时,新加的artifact不能选中

首先保证添加artifact无问题&#xff0c;比如依赖都正确、无重复命令的情况等 办法 一 File > Invalidate Caches / Restart。 重启IDEA后&#xff0c;重新检查Artifact是否可选 办法 二 打开 Project Structure&#xff08;CtrlShiftAltS&#xff09;。 进入 Artifacts 选…

Paramiko 使用教程

目录 简介安装 Paramiko连接到远程服务器执行远程命令文件传输示例 简介 Paramiko 是一个基于 Python 的 SSH 客户端库&#xff0c;它提供了在网络上安全传输文件和执行远程命令的功能。本教程将介绍 Paramiko 的基本用法&#xff0c;包括连接到远程服务器、执行命令、文件传输…

《TCP/IP网络编程》学习笔记 | Chapter 24:制作 HTTP 服务器端

《TCP/IP网络编程》学习笔记 | Chapter 24&#xff1a;制作 HTTP 服务器端 《TCP/IP网络编程》学习笔记 | Chapter 24&#xff1a;制作 HTTP 服务器端HTTP 概要理解 Web 服务器端无状态的 Stateless 协议请求消息&#xff08;Request Message&#xff09;的结构响应消息&#x…

【Quest开发】在虚拟世界设置具有遮挡关系的透视窗口

软件&#xff1a;Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件&#xff1a;Meta Quest3 仅针对urp管线 参考了YY老师这篇&#xff0c;可以先看他的再看这个可能更好理解一些&#xff1a;Unity Meta Quest MR 开发&#xff08;七&#xff09;&#xff1a;使…

GPU 招投标全流程分析与总结

GPU 招投标全流程分析与总结 招投标流程概述 以下是通过代理商采购Nvidia H20-GPU 141G的招投标全流程分析: #mermaid-svg-hMPPfkCpGj8GKXfV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hMPPfkCpGj8GKXfV .er…

[C++] STL中的向量容器<vector>附加练习

目录 讲在前面(必看)八卦阵题目描述输入格式输出格式输入输出样例数据范围AC代码及要点 决赛应援题目描述输入格式输出格式输入输出样例数据范围AC代码及要点 讲在前面(必看) 本篇为练习篇, vector讲解篇在这里. 菜鸟食用前请做好心理准备(你懂的) 八卦阵 题目描述 n 名同学…

基于SpringBoot+Vue3实现的宠物领养管理平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高&#xff0c;越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员&#xff0c;人们对于宠物的关爱和照顾也日益增加。然而&#xff0c;传统的宠物领养流程存在诸多不便&a…

parameter和localparam的区别(verilog中)

在Verilog中&#xff0c;parameter 和 localparam 都用于定义常量&#xff0c;但是它们之间有一些重要的区 作用范围&#xff1a; parameter&#xff1a;可以在模块外部被修改或重定义。它可以被作为模块的参数传递给其他模块&#xff0c;因此具有较广泛的作用范围&#xff0c;…

鸿蒙API15 “一多开发”适配:解锁黄金三角法则,开启高效开发新旅程

一、引言 在万物互联的时代浪潮中&#xff0c;鸿蒙操作系统以其独特的 “一多开发” 理念&#xff0c;为开发者打开了一扇通往全场景应用开发的新大门。“一多开发”&#xff0c;即一次开发&#xff0c;多端部署 &#xff0c;旨在让开发者通过一套代码工程&#xff0c;就能高效…

Linux中docker容器拉取镜像失败解决方案

查看 /etc/systemd/system/docker.service.d/http-proxy.conf 文件&#xff08;没有则新建&#xff09;&#xff0c;查看自定义 Docker 服务的代理设置 输入内容 [Service] Environment"HTTP_PROXYsocks5://10.211.13.214:7890" Environment"HTTPS_PROXYsocks…

半导体设备通信标准—secsgem v0.3.0版本使用说明文档(2)之GEM(SEMI 30)

文章目录 1、处理器1.1、事件 2、GEM 合规性2.1、状态模型2.2、 设备加工状态2.3、 文档2.4、 控制 &#xff08;作员启动&#xff09;2.5、 动态事件报告配置2.6、 跟踪数据收集2.7、 报警管理2.8、 远程控制2.9、 设备常量2.10、 工艺配方管理2.11、 物料移动2.12、 设备终端…