Redis命令——list

news2025/4/20 16:59:03
列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素(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.coloradmin.cn/o/2338859.html

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

相关文章

MicroDEM 与 OpenEV(FWTtools工具包):两款开源DEM相关小软件

大家好&#xff0c;今天为大家介绍的软件是MicroDEM 与 OpenEV&#xff0c;这两款小软件分别主要用于DEM数据的处理、数据查看与分析。MICRODEM是一款专注于地理空间分析和遥感数据处理的开源小软件。 MICRODEM官网网址为&#xff1a;https://microdem.org/&#xff0c;官网比较…

STM32使用rand()生成随机数并显示波形

一、随机数生成 1、加入头文件&#xff1a;#include "stdlib.h" 2、定义一个用作生成随机数种子的变量并加入到滴答定时器中不断自增&#xff1a;uint32_t run_times 0; 3、设置种子&#xff1a;srand(run_times);//每次生成随机数前调用一次为佳 4、生成一个随…

大语言模型智能体:安全挑战与应对之道

在当今科技飞速发展的时代&#xff0c;大语言模型驱动的智能体正逐渐融入我们生活和工作的方方面面&#xff0c;给我们带来了诸多便利。但与此同时&#xff0c;它们的安全问题也引起了广泛的关注。今天&#xff0c;咱们就一起来深入了解一下可信大语言模型智能体所面临的安全挑…

每日OJ_牛客_kotori和素因子_DFS_C++_Java

目录 牛客_kotori和素因子_DFS 题目解析 C代码 Java代码 牛客_kotori和素因子_DFS kotori和素因子 描述&#xff1a; kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。但是&#xff0c;kotori有强迫症&#xff0c;她不允许两个不同的正整数取出相同的素因子…

快手OneRec 重构推荐系统:从检索排序到生成统一的跃迁

文章目录 1. 背景2. 方法2.1 OneRec框架2.2 Preliminary2.3 生成会话列表2.4 利用奖励模型进行迭代偏好对齐2.4.1 训练奖励模型2.4.2 迭代偏好对齐 3. 总结 昨天面试的时候聊到了OneRec&#xff0c;但是由于上次看这篇文章已经是一个月之前&#xff0c;忘得差不多了&#xff0c…

软件测试的页面交互标准:怎样有效提高易用性

当用户遇到"反人类"设计时 "这个按钮怎么点不了&#xff1f;"、"错误提示完全看不懂"、"我输入的内容去哪了&#xff1f;"——这些用户抱怨背后&#xff0c;都指向同一个问题&#xff1a;页面交互的易用性缺陷。作为软件测试工程师&a…

共享单车出行规律与决定因素的空间交互分析——以北京六大区为例

共享单车出行规律与决定因素的空间交互分析——以北京六大区为例 原文&#xff1a;Spatial Interaction Analysis of Shared Bicycles Mobility Regularity and Determinants: A Case Study of Six Main Districts, Beijing 这篇文章主要研究了北京六个主要城区共享单车的流动…

Windows上安装FFmpeg的详细指南

1.下载FFmpeg 访问FFmpeg官方下载页面&#xff1a;https://ffmpeg.org/download.html 点击"Windows builds from gyan.dev"或"Windows builds by BtbN" gyan.dev版本&#xff1a;https://www.gyan.dev/ffmpeg/builds/ BtbN版本&#xff1a;https://githu…

作业2 CNN实现手写数字识别

# 导入必要库 import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 用于高级可视化 from tensorflow import keras from tensorflow.keras import layers from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay import time # 用于…

WordPress自定义页面与文章:打造独特网站风格的进阶指南

文章目录 引言一、理解WordPress页面与文章的区别二、主题与模板层级&#xff1a;自定义的基础三、自定义页面模板&#xff1a;打造专属页面风格四、自定义文章模板&#xff1a;打造个性化文章呈现五、使用自定义字段和元数据&#xff1a;增强内容灵活性六、利用WordPress钩子&…

PHP最新好看UI个人引导页网页源码

PHP最新好看UI个人引导页网页源码 采用PHP、HTML、CSS及JavaScript等前端技术&#xff0c;构建了一个既美观又实用的个人主页解决方案。 源码设计初衷在于提供一个高度可定制、跨平台兼容的模板&#xff0c;让用户无需深厚的编程基础&#xff0c;即可快速搭建出专业且富有创意的…

arkTs:使用回调函数的方法实现子组件向父组件传值

使用回调函数的方法实现子组件向父组件传值 1 主要内容说明2 实现步骤2.1 父组件中定义回调函数2.2 子组件声明并调用回调函数2.3 注意事项 3 源码3.1 父组件3.2 子组件3.3 源码效果显示截图 4 结语5 定位日期 1 主要内容说明 本文源码是一套 父组件与子组件之间双向数据传递的…

VBA 调用 dll 优化执行效率

问题描述 之前excel 用vba写过一个应用&#xff0c;请求的是aws lambda 后端, 但是受限于是云端服务&#xff0c;用起来响应特别慢&#xff0c;最近抽了点时间准备优化下&#xff0c;先加了点日志看看是哪里慢了 主方法代码如下&#xff0c;函数的主要目的是将 Excel 工作簿的…

Django-Friendship 项目常见问题解决方案

Django-Friendship 项目常见问题解决方案 django-friendship Django app to manage following and bi-directional friendships 项目地址: https://gitcode.com/gh_mirrors/dj/django-friendship Django-Friendship 是一个基于 Django 的应用&#xff0c;它允许创建和管…

AI时代下 你需要和想要了解的英文缩写含义

在AI智能时代下&#xff0c;越来愈多的企业都开始重视并应用以及开发AI相关产品&#xff0c;这个时候都会或多或少的涉及到英文&#xff0c;英文还好&#xff0c;但是如果是缩写&#xff0c;如果我们没有提前了解过&#xff0c;我们往往很难以快速Get到对方的意思。在这里&…

2025年对讲机选购指南:聚焦核心参数与场景适配

在无线通信领域&#xff0c;对讲机始终占据着专业通讯工具的独特地位。随着5G时代到来和物联网技术深化&#xff0c;2025年的对讲机市场正呈现智能化、专业化、场景化的升级趋势。面对琳琅满目的产品&#xff0c;选购者需从通信性能、环境适应性、智能集成度三个维度进行综合考…

C/C++ 动态链接详细解读

1. 为什么要动态链接&#xff1f; 1.1 静态链接浪费内存和磁盘空间 静态链接的方式对于计算机内存和磁盘空间浪费非常严重&#xff0c;特别是多进程操作系统的情况下&#xff0c;静态链接极大的浪费了内存空间。在现在的Linux系统中&#xff0c;一个普通的程序会使用的C 语言静…

python flask 项目部署

文章目录 概述 windows 部署准备工作使用 Waitress 部署 Flask 应用 linux 部署**2. 使用 WSGI 服务器**示例&#xff1a;使用 Gunicorn nginx反向代理**5. 使用进程管理工具**示例&#xff1a;使用 Systemd 概述 在 Windows 上使用 Waitress 部署 Flask 应用是一个不错的选择…

Java课程内容大纲(附重点与考试方向)

本文是在传统 Java 教程框架基础上&#xff0c;加入了重点提示与考试思路&#xff0c;适合用于课程备考、知识查漏与面试准备。 第1章&#xff1a;Java语言基础 ⭐ 重点知识&#xff1a; Java平台特点&#xff08;跨平台性、JVM&#xff09; JDK、JRE、JVM 区别 Java 程序的…

200+短剧出海平台:谁能成为“海外红果”?

2025年&#xff0c;短剧的国际市场表现令人瞩目。仅在两年前&#xff0c;业界关注的焦点仍是美国市场&#xff0c;如今国产短剧应用已成功打入包括印尼、巴西、美国、墨西哥、印度、菲律宾、泰国、日本、哥伦比亚及韩国在内的多个国家&#xff0c;轻松获得超过500万次下载。 市…