redis数据类型:list

list 的相关命令配合使用的应用场景:

  • 栈和队列:插入和弹出命令的配合,亦可实现栈和队列的功能
    实现哪种数据结构,取决于插入和弹出命令的配合,如
  • 左插右出右插左出:这两种种方式实现先进先出的数据结构,即异侧配合可以实现队列结构。
  • 左插左出或者右插右出:这两种方式可以实现先进后出的数据结构,即同侧配合可以实现栈结构。
  • 消息队列:实现发布与订阅模型。
    • 生产者使用尾部插入命令RPUSH 将消息插入 list; 消费者使用LPOP 命令从 list 的左边消费消息
    • 生产者使用尾部插入命令LPUSH 将消息插入 list; 消费者使用RPOP 命令从 list 的左边消费消息
  • 限流:
    • 每次请求时向 List 添加时间戳,通过检查 List 长度来决定是否允许新的请求,实现 API 请求频率控制。
  • 缓存记录:聊天记录、文章推送,热点数据等。

简介

Redis lists are linked lists of string values. Redis lists are frequently used to:

  • Implement stacks and queues.
  • Build queue management for background worker systems.

list 结构示意图,可参考 python 中的 list,特别是范围查找逻辑

在这里插入图片描述

list 类型支持双向查找:

  • 正序查找:如 0 到 5,从头开始算起,
  • 负序查找:如 0 到 -5,

通常用于实现栈和队列

  • 栈:先进后出,使用 list 的 lpush 可以实现栈的功能,依次向前插入数据,按正序索引取值的时候,可以实现栈的功能。
  • 队列:先进先出,使用 rpush可以实现队列的功能,依次向后插入数据,按正序索引取值的时候,可以实现队列的功能。

The max length of a Redis list is 2 32 − 1 2^{32} - 1 2321 (4,294,967,295) elements.

命令

插入元素

  • 头部插入LPUSH adds a new element to the head of a list;
LPUSH key element [element ...]

该命令会向list 的头部依次插入给定的元素,在读取该命令插入数据的时候,就像在使用栈一样,元素先进后出。

  • 逐次插入元素示意图,这种方式可以将 list 当栈来使用
127.0.0.1:6379> lpush block jj1
(integer) 1
127.0.0.1:6379> lindex block 0
"jj1"
127.0.0.1:6379> lpush block jj2
(integer) 2
127.0.0.1:6379> lindex block 0
"jj2"
127.0.0.1:6379> 

在这里插入图片描述

  • 批量插入元示意图,取出元素的时候,可以发现符合栈的结构特点:先进后出。
127.0.0.1:6379> lpush block jj1 jj2 jj3 jj4 jj5
(integer) 5

上述命令执行逻辑是,元素依次入栈。jj1 将位于栈低,jj5将位于栈顶。

127.0.0.1:6379> lrange block 0 5
1) "jj5"
2) "jj4"
3) "jj3"
4) "jj2"
5) "jj1"

上述命令执行结果存储示意图

在这里插入图片描述

  • 尾部插入RPUSH adds to the tail.
RPUSH key element [element ...]

该命令会向list 的尾部依次插入给定的元素,在读取该命令插入数据的时候,就像在使用队列一样,元素先进先出。

127.0.0.1:6379> rpush block1 jj1 jj2 jj3 jj4 jj5
(integer) 5
127.0.0.1:6379> lindex block1 0
"jj1"
127.0.0.1:6379> 

查找元素的索引

LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
  • RANK rank : 排名,次序
    • 假设 list 中有多个 a,则 rank 2 表示查找 第二个 a 出现的位置,可参考案例
    • rank :可以是赋值,表示倒数第一个, rank -1 表示倒数第一个

The command returns the index of matching elements inside a Redis list. By default, when no options are given, it will scan the list from head to tail, looking for the first match of “element”. If the element is found, its index (the zero-based position in the list) is returned. Otherwise, if no match is found, nil is returned.

  1. 该命令返回 Redis 列表中匹配元素的索引。
  2. 默认情况下,如果没有给出任何选项,它将从头到尾扫描列表,寻找第一个匹配的“元素”。
  3. 如果找到元素,则返回其索引(列表中从零开始的位置)。否则,如果未找到匹配项,则返回 nil。
  • 查看现有数据
127.0.0.1:6379> lrange block 0 8
1) "jj5"
2) "a"
3) "jj4"
4) "a"
5) "a"
6) "jj3"
7) "jj2"
8) "jj1"
127.0.0.1:6379>
  • 查找第一个 a 所在的索引(位置): rank n 表示第一个,
    • n为正序:表示正数第几个
    • n为负数:表示倒数第几个:
127.0.0.1:6379> lpos block a
(integer) 1
127.0.0.1:6379> lpos block a rank 1
(integer) 1
127.0.0.1:6379> lpos block a rank -1  # 倒数第1个 a的位置
(integer) 4
127.0.0.1:6379> lpos block a rank -2  # 倒数第2个 a的位置
(integer) 3
127.0.0.1:6379>
  • 返回前n 个 指定元素所在的位置,如返回 list 中前两个 a 的位置:
127.0.0.1:6379> lpos block a count 2 # 前2 个所在的位置
1) (integer) 1
2) (integer) 3
127.0.0.1:6379>

元素的个数

  • LLEN returns the length of a list.

Returns the length of the list stored at key. If key does not exist, it is interpreted as an empty list and 0 is returned. An error is returned when the value stored at key is not a list.

返回按键存储的列表的长度。

  1. 如果键不存在,则将其解释为空列表并返回0。
  2. 如果键上存储的值不是列表,则返回错误。
  • 查看 block元素的个数
127.0.0.1:6379> llen block
(integer) 5
127.0.0.1:6379>
  • 查看所有的键
127.0.0.1:6379> keys *
1) "coinmarketapikey"
2) "block"
3) "exchangerate"
4) "apikeyexceeded"
5) "mysite"
127.0.0.1:6379>
  • 查看不存在的键的元素个数,返回 0
127.0.0.1:6379> llen block1
(integer) 0
127.0.0.1:6379>
  • 使用此命令查看 hash 类型:命令错误的使用方式
127.0.0.1:6379> llen mysite
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>

删除元素

  • 头部移除LPOP removes and returns an element from the head of a list;

Removes and returns the first elements of the list stored at key.

By default, the command pops a single element from the beginning of the list. When provided with the optional count argument, the reply will consist of up to count elements, depending on the list’s length.

  1. 移除并返回 list 的第一个元素。
  2. 如果给定了个数 count,则会从 list前面移除指定个数的元素。
LPOP key [count]
  • 尾部移除RPOP does the same but from the tails of a list.
LPOP key [count]

Removes and returns the last elements of the list stored at key.

By default, the command pops a single element from the end of the list. When provided with the optional count argument, the reply will consist of up to count elements, depending on the list’s length.

  1. 移除并返回 list 的最后一个元素。
  2. 如果给定了个数 count,则会从 list后面移除指定个数的元素。

移走元素

LMOVE atomically moves elements from one list to another.

LMOVE source destination <LEFT | RIGHT> <LEFT | RIGHT>
  • <LEFT | RIGHT>
    • 第一个选项,指要移出位于source 的头部|尾部的元素
    • 第二个选项,从source 移除的元素要插入 destination 的位置头部|尾部

Atomically returns and removes the first/last element (head/tail depending on the wherefrom argument) of the list stored at source, and pushes the element at the first/last element (head/tail depending on the whereto argument) of the list stored at destination.

原子地返回并删除存储在源中的列表的第一个/最后一个元素(head/tail 取决于 where 参数) ,并将元素推送到存储在目的地的列表的第一个/最后一个元素(head/tail 取决于 where 参数)。

For example: consider source holding the list a,b,c, and destination holding the list x,y,z. Executing LMOVE source destination RIGHT LEFT results in source holding a,b and destination holding c,x,y,z.

举例说明:假设现有两个 list:

  • key 为 source 值为 a,b,c,
  • key 为 destination 值为 x,y,z

执行移走命令:

LMOVE source destination RIGHT LEFT 

结果为:

  • source 值为 a,b,
  • destination 值为 c,x,y,z

获取元素

按下表(索引)检索
LINDEX key index

Returns the element at index index in the list stored at key. The index is zero-based, so 0 means the first element, 1 the second element and so on. Negative indices can be used to designate elements starting at the tail of the list. Here, -1 means the last element, -2 means the penultimate and so forth.

When the value at key is not a list, an error is returned.

  1. 返回键存储的列表中索引位置的元素。
    1. 索引是从零开始的,所以0表示第一个元素,1表示第二个元素,依此类推。
    2. 负索引可用于指定从列表尾部开始的元素。在这里,-1表示最后一个元素,-2表示倒数第二个元素,依此类推。
  2. 当 key 值不是列表时,将返回错误。
按范围检索

可参考 python 中的 list

if __name__ == '__main__':list_ = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(list_[0:-1])print(list_[-5:-3])

LRANGE extracts a range of elements from a list,与 python 中的 list 有着同样的结构。

LRANGE key start stop
  • start:包含此位置的元素
  • stop:包含此位置的元素

Returns the specified elements of the list stored at key. The offsets start and stop are zero-based indexes, with 0 being the first element of the list (the head of the list), 1 being the next element and so on.

These offsets can also be negative numbers indicating offsets starting at the end of the list. For example, -1 is the last element of the list, -2 the penultimate, and so on.

Out of range indexes will not produce an error. If start is larger than the end of the list, an empty list is returned. If stop is larger than the actual end of the list, Redis will treat it like the last element of the list.

  1. 返回按键存储的列表的指定元素。
    1. 偏移量 start 和 stop 是从零开始的索引,0是列表的第一个元素(列表的头) ,1是下一个元素,依此类推。
    2. 这些偏移量也可以是负数,表示从列表末尾开始的偏移量。例如,-1是列表的最后一个元素,-2是倒数第二个元素,依此类推。
  2. 索引越界:不存在这种异常,redis 会自动处理
127.0.0.1:6379> lrange block -8 -3
1) "jj5"
2) "a"
3) "jj4"
4) "a"
5) "a"
6) "jj3"
127.0.0.1:6379>

插入元素

LINSERT key <BEFORE | AFTER> pivot element
  • <BEFORE | AFTER> :要在指定值 pivot 前|后 插入 element
  • element :要插入的元素
  • pivot:list 中已存在的数据

Inserts element in the list stored at key either before or after the reference value pivot.

When key does not exist, it is considered an empty list and no operation is performed.

An error is returned when key exists but does not hold a list value.

  1. 在引用值 pivot 之前或之后按键存储的列表中插入元素。
  2. 如果键不存在,则将其视为空列表,不执行任何操作。
  3. 如果键存在但不包含列表值,则返回错误。
  • 插入一个元素
127.0.0.1:6379>  linsert block before  jj3 a
(integer) 6
127.0.0.1:6379> lrange block 0 8
1) "jj5"
2) "jj4"
3) "a"
4) "jj3"
5) "jj2"
6) "jj1"
127.0.0.1:6379>
  • 在不存在的值前后插入元素
127.0.0.1:6379> linsert block before  love me
(integer) -1
127.0.0.1:6379>

减少元素

LTRIM reduces a list to the specified range of elements.

Trim an existing list so that it will contain only the specified range of elements specified. Both start and stop are zero-based indexes, where 0 is the first element of the list (the head), 1 the next element and so on.

For example: LTRIM foobar 0 2 will modify the list stored at foobar so that only the first three elements of the list will remain.

start and end can also be negative numbers indicating offsets from the end of the list, where -1 is the last element of the list, -2 the penultimate element and so on.

Out of range indexes will not produce an error: if start is larger than the end of the list, or start > end, the result will be an empty list (which causes key to be removed). If end is larger than the end of the list, Redis will treat it like the last element of the list.

  1. 修剪现有列表,使其仅包含指定的元素范围。
  2. Start 和 stop 都是从零开始的索引,其中0是列表的第一个元素(head) ,1是下一个元素,依此类推。
    1. 例如: LTRIM foobar 02将修改存储在 foobar 中的列表,以便只保留列表的前三个元素。
    2. Start 和 end 也可以是负数,表示从列表末尾开始的偏移量,其中 -1是列表的最后一个元素,-2是倒数第二个元素,依此类推。
  3. 超出范围的索引不会产生错误:
    1. 如果 start 大于列表的末尾,或 start > end,结果将是一个空列表(这将导致删除键)。
    2. 如果 end 大于列表的末尾,Redis 会将其视为列表的最后一个元素。
127.0.0.1:6379> lrange block 0 100
1) "jj5" # 0
2) "a" # 1
3) "jj4" # 2
4) "a"
5) "a"
6) "jj3" # -3
7) "jj2" #-2
8) "jj1"  #-1
127.0.0.1:6379> ltrim block 2 -3
OK
127.0.0.1:6379> lrange block 0 100
1) "jj4"
2) "a"
3) "a"
4) "jj3"
127.0.0.1:6379>

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

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

相关文章

IDEA中解决Edit Configurations中没有tomcat Server选项的问题

今天使用IDEA2024专业版的时候,发现Edit Configurations里面没有tomcat Server,最终找到解决方案。 一、解决办法 1、打开Settings 2、搜索tomcat插件 搜索tomcat插件之后,找到tomcat 发现tomcat插件处于未勾选状态,然后我们将其勾选保存即可。 二、结果展示 最后,再次编…

复习打卡大数据篇——Hadoop HDFS 02

目录 1. HDFS辅助工具 2. namenode安全模式 1. HDFS辅助工具 跨集群数据拷贝 当我们需要跨集群进行文件数据的拷贝时可以用&#xff1a; hadoop distcp 集群1的某个文件路径 要拷贝到集群2的地址路径 文件归档工具archive 由于HDFS的块的数量取决于文件的大小和数量&…

Mamba安装环境和使用,anaconda环境打包

什么是mamba Mamba是一个极速版本的conda&#xff0c;它是conda的C重新实现&#xff0c;使用多线程并行处理来加速包和依赖项的下载。 Mamba旨在提高安装、更新和卸载Python包的速度&#xff0c;同时保持与conda相同的兼容性和命令行接口。 Mamba的核心部分使用C实现&#xff…

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导 Sigrity System Explorer Snip Via Pattern From Layout模式支持从其它设计中截取过孔模型用于仿真分析,同样以差分模板为例 具体操作如下 双击打开System Explorer软件…

顺序表的操作

注意位序和数组下标的关系 插入&#xff1a; 插入的时间复杂度&#xff1a; 最深层语句&#xff1a; 最好情况 最坏情况 平均情况 删除&#xff1a; 查找&#xff1a;

以腾讯混元模型为例,在管理平台上集成一个智能助手

背景 前几天&#xff0c;公司的同事们一起吃了个饭&#xff0c;餐桌上大家聊到大模型的落地场景。我个人在去年已经利用百度千帆平台写过案例&#xff0c;并发过博客&#xff08;传送门&#x1f449;&#xff1a;利用文心千帆打造一个属于自己的小师爷&#xff09;&#xff0c…

计算机基础 试题

建议做的时候复制粘贴,全部颜色改为黑色,做完了可以看博客对答案。 一、单项选择题(本大题共25小题,每小题2分,共50分〉 1.计算机内部采用二进制数表示信息,为了便于书写,常用十六进制数表示。一个二进制数0010011010110用十六进制数表示为 A.9A6 B.26B C.4D6 D.…

[机器学习]XGBoost(3)——确定树的结构

XGBoost的目标函数详见[机器学习]XGBoost&#xff08;2&#xff09;——目标函数&#xff08;公式详解&#xff09; 确定树的结构 之前在关于目标函数的计算中&#xff0c;均假设树的结构是确定的&#xff0c;但实际上&#xff0c;当划分条件不同时&#xff0c;叶子节点包含的…

【AI驱动的数据结构:包装类的艺术与科学】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 包装类装箱和拆箱阿里巴巴面试题 包装类 在Java中基本数据类型不是继承来自Object&#xff0c;为了…

探索Moticon智能传感器鞋垫OpenGo的功能与优势

Moticon智能传感器鞋垫OpenGo是一款专为运动科学和临床研究设计的先进工具。它通过13枚压力传感器、1枚3D加速器和1枚温度传感器&#xff0c;实时监测脚部的压力分布和步态变化。用户可以通过配套的Beaker应用&#xff0c;将这些数据以图表形式呈现&#xff0c;便于分析和理解。…

hive注释comment中文乱码解决

问题描述 当使用以下命令查看表的元数据信息时出现中文乱码&#xff08;使用的是idea连接hive&#xff09; desc formatted test.t_archer; 解决 连接保存hive元数据的MySQL数据库&#xff0c;执行以下命令&#xff1a; use hive3; show tables;alter table hive3.COLUMNS_…

模型 结构化思维

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。分步拆解&#xff0c;系统思考。 1 结构化思维的应用 1.1 提升销售额的结构化思维应用案例 小李是一家电商公司的运营经理&#xff0c;面对激烈的市场竞争&#xff0c;公司希望在下个季度实现销售额…

uniApp上传文件踩坑日记

最近在做移动端app&#xff0c;开始接触uniapp。想着直接用PC端的前后端API去做文件上传&#xff0c;但是uniapp的底层把请求拆成了普通请求和文件上传请求&#xff0c;所以不能用一个axios去做所有请求的处理&#xff0c;拆成uni.request和uni.uploadFile去分别处理两种情况。…

数据压缩比 38.65%,TDengine 重塑 3H1 的存储与性能

小T导读&#xff1a;这篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的三等奖作品之一。作者通过自身实践&#xff0c;详细分享了 TDengine 在高端装备运维服务平台中的应用&#xff0c;涵盖架构改造、性能测试、功能实现等多个方面。从压缩效率到查询性能&#x…

电气设计 | 低压接地系统:TN-C 、TN-S、TN-C-S、TT适用哪些场所?

电气设计 | 低压接地系统&#xff1a;TN-C 、TN-S、TN-C-S、TT适用哪些场所&#xff1f; 1、低压配电系统简介2、各种低压配电系统介绍2.1、TN-C系统2.2、TN-S系统2.3、TN-C-S 系统2.4、TT 系统2.5、IT 系统 1、低压配电系统简介 低压配电系统有TN-C、TN-S、TN-C-S、TT和IT五种…

onlyoffice连接器 二次开发 合同等制式模板化技术开发方案【三】

一、期望效果 目前曹瑞版本onlyoffice已经实现&#xff1a;书签模式 和 控件模式&#xff0c;用以支持该方案。 【图1】字段绑定 【图2】模板发起 【图3】接入表单 思路讲解&#xff1a; 业务系统开发中通常希望能够通过绑定form字段给word&#xff0c;从而达到双向同步效果&am…

word实现两栏格式公式居中,编号右对齐

1、确定分栏的宽度 选定一段文字 点击分栏&#xff1a;如本文的宽度为22.08字符 2、将公式设置为 两端对齐&#xff0c;首行无缩进。 将光标放在 公式前面 点击 格式-->段落-->制表位 在“制表位位置”输入-->11.04字符&#xff08;22.08/211.04字符&#xff09;&…

37. Three.js案例-绘制部分球体

37. Three.js案例-绘制部分球体 实现效果 知识点 WebGLRenderer WebGLRenderer 是Three.js中的一个渲染器类&#xff0c;用于将3D场景渲染到网页上。 构造器 WebGLRenderer( parameters : Object ) 参数类型描述parametersObject渲染器的配置参数&#xff0c;可选。 常用…

笔记本电脑需要一直插着电源吗?电脑一直充电的利弊介绍

笔记本电脑属于常用电子设备&#xff0c;它的便携性和功能性给我们带来了很多便利。但是&#xff0c;我们在使用笔记本电脑的时候&#xff0c;是否应该一直插着电源呢&#xff1f;这个问题可能困扰了很多人&#xff0c;因为不同的使用方式可能会对笔记本电脑的性能和寿命产生不…

深入理解延迟队列:原理、实现与应用

深入理解延迟队列&#xff1a;原理、实现与应用 1. 什么是延迟队列 延迟队列&#xff08;Delayed Queue&#xff09;是一种特殊的队列&#xff0c;它的特点是队列中的元素需要在指定的时间后才能被消费者获取和处理。与普通的先进先出&#xff08;FIFO&#xff09;队列不同&a…