【redis】数据类型之list

Redis的List数据类型是一个双向链表,支持在链表的头部(left)和尾部(right)进行元素的插入(push)和弹出(pop)操作。这使得List既可以用作栈(stack),也可以用作队列(queue)。

有关list类型的命令可以通过help @list命令来查看。有关命令的使用可以通过help 命令来查看,例如help lpush

简单使用

LPUSH

lpush:在列表的左边插入元素。

语法:

LPUSH key element [element ...]

使用:

127.0.0.1:6379> lpush k1 a b c d
(integer) 4

LRANGE

lrange:查看列表中的元素。

语法:

LRANGE key start stop

使用:

127.0.0.1:6379> lrange k1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"

LPOP

lpop:从列表的左边取出一个元素。

语法:

LPOP key [count]

使用

127.0.0.1:6379> lpop k1
"d"127.0.0.1:6379> lpop k1 3
1) "c"
2) "b"
3) "a"

RPUSH

rpush:在列表的右边插入元素。

语法:

RPUSH key element [element ...]

使用:

127.0.0.1:6379> rpush k1 a b c d
(integer) 4

RPOP

rpop:从列表的右边取出一个元素。

语法:

RPOP key [count]

使用:

127.0.0.1:6379> rpop k1
"d"127.0.0.1:6379> rpop k1 3
1) "c"
2) "b"
3) "a"

LINDEX

lindex:查询指定索引的元素。

语法:

LINDEX key index

使用:

127.0.0.1:6379> lpush k1 a b c d
(integer) 4127.0.0.1:6379> lindex k1 -1
"a"

LLEN

llen:获取列表的长度。

语法:

LLEN key

使用:

127.0.0.1:6379> llen k1
(integer) 4

LINSERT

linsert:在指定元素的前面或后面插入元素。

语法:

LINSERT key BEFORE|AFTER pivot element

使用:

127.0.0.1:6379> linsert k1 before b x
(integer) 5127.0.0.1:6379> lrange k1 0 -1
1) "d"
2) "c"
3) "x"
4) "b"
5) "a"

LREM

lrem:根据指定个数的指定元素。

语法:

LREM key count element

使用:

127.0.0.1:6379> lrange k1 0 -1
1) "a"
2) "c"
3) "b"
4) "a"
5) "d"
6) "c"
7) "x"
8) "b"
9) "a"127.0.0.1:6379> lrem k1 2 a
(integer) 2127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "d"
4) "c"
5) "x"
6) "b"
7) "a"

使用的lrem的注意事项:

  • 指定的count超出列表中对应元素的个数,删除所有指定的元素。

  • count为负数,从右往左删除。

  • count为0,删除所有指定的元素。

  • count为正数,从左往右删除。

LSET

lset:设置指定索引位置的元素。

语法:

LSET key index element

使用:

127.0.0.1:6379> lset k1 3 y
OK127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "d"
4) "y"
5) "x"
6) "b"
7) "a"

LTRIM

ltrim:截取保留列表中指定索引的元素。

语法:

LTRIM key start stop

使用:

127.0.0.1:6379> ltrim k1 3 6
OK127.0.0.1:6379> lrange k1 0 -1
1) "y"
2) "x"
3) "b"
4) "a"

LPOS

lpos:在列表中匹配第一个找到的元素,可以指定范围,默认从头到尾扫描。

语法:

LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]

使用:

127.0.0.1:6379> rpush k2 a b c 1 2 3 c c
(integer) 8127.0.0.1:6379> lpos k2 c
(integer) 2127.0.0.1:6379> lpos k2 c rank 2
(integer) 6127.0.0.1:6379> lpos k2 c rank -1
(integer) 7127.0.0.1:6379> lpos k2 c count 2
1) (integer) 2
2) (integer) 6

LMOVE

lmove:用于从一个列表弹出一个元素,并将其推入到另一个列表中。这个命令通常用于在两个列表之间转移元素,或者在处理消息队列时,从一个队列中取出任务并将其放入另一个队列中。

语法:

LMOVE source destination LEFT|RIGHT LEFT|RIGHT

使用:

127.0.0.1:6379> lmove k1 k3 LEFT RIGHT
"y"

LPUSHX

lpushx:用于将一个或多个值插入到已存在的列表的头部(左端)。与LPUSH命令不同的是,如果指定的列表不存在,LPUSHX命令不会创建新列表,而是直接返回操作失败。

语法:

LPUSHX key element [element ...]

使用:

127.0.0.1:6379> lpushx k1 xx
(integer) 5127.0.0.1:6379> lpushx kk xx
(integer) 0

RPOPLPUSH

rpoplpush:从源列表的右端(尾部)弹出一个元素,并将该元素插入到目标列表的左端(头部)。这个命令通常用于在两个列表之间安全地传递元素,特别是在实现队列或任务调度时非常有用。

语法:

RPOPLPUSH source destination

使用:

127.0.0.1:6379> rpoplpush k1 k3
"a"

RPUSHX

rpushx:用于将一个或多个值插入到已存在的列表的尾部(右端)。与RPUSH命令不同的是,如果指定的列表不存在,RPUSHX命令不会创建新列表,而是直接返回操作失败。

语法:

RPUSHX key element [element ...]

使用:

127.0.0.1:6379> rpushx k3 a b
(integer) 4127.0.0.1:6379> rpushx kv a b
(integer) 0

阻塞命令的使用

BLMOVE

blmove:用于将一个元素从一个列表移动到另一个列表,并在源列表为空时阻塞操作,直到有元素可用或达到超时时间。

语法:

BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout

使用:

127.0.0.1:6379> blmove k1 k3 LEFT RIGHT 2000
"xx"127.0.0.1:6379> blmove emptylist k3 LEFT RIGHT 2
(nil)
(2.03s)

BLPOP

blpop:从列表的左端(头部)弹出一个元素,并阻塞等待直到列表中出现元素可弹出或达到超时时间。

语法:

BLPOP key [key ...] timeout

使用:

127.0.0.1:6379> blpop k1 2
1) "k1"
2) "xx"127.0.0.1:6379> blpop emptylist 2
(nil)
(2.02s)

BRPOP

brpop:从列表的右端(尾部)弹出一个元素,并阻塞等待直到列表中出现元素可弹出或达到超时时间。

语法:

BRPOP key [key ...] timeout

使用:

127.0.0.1:6379> brpop k1 2
1) "k1"
2) "b"127.0.0.1:6379> brpop emptylist 2
(nil)
(2.02s)

BRPOPLPUSH

brpoplpush:BRPOPLPUSH命令的行为与RPOPLPUSH命令完全相同,即从source列表的尾部弹出一个元素,并将该元素推入到destination列表中。

当source列表为空时,Redis将阻塞连接,直到另一个客户端向source列表推送元素,或者直到指定的timeout时间达到。

语法:

BRPOPLPUSH source destination timeout

使用:

127.0.0.1:6379> brpoplpush k3 k4 2
"xx"

内部编码

列表类型的内部编码为quicklist

127.0.0.1:6379> rpush k3 a b c
(integer) 3127.0.0.1:6379> object encoding k3
"quicklist"

使用场景

  1. 链表:lpush+rpop,rpush+lpop,反向命令的组合可以实现链表。

  2. 栈:lpush+lpop,rpush+rpop,同向命令的组合可以实现栈。

  3. 数组:rpush+lindex+lset,可以实现数组的功能。

  4. 消息队列:lpush+brpop。

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

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

相关文章

用 DeepSeek + Kimi 自动做 PPT,效率起飞

以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤: 利用 DeepSeek 生成 PPT 内容: 访问 DeepSeek 官网,完成注册/登录后进入对话界面。输入指令,例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲,需包…

机器学习怎么学习,还有算法基本的源代码

1.scikit-learn官方文档,中文版/英文版 中文社区:https://scikit-learn.org.cn/ 中文官方文档:https://scikitlearn.com.cn/ 英文版:https://scikit-learn.org/stable/(翻墙) 2.菜鸟教程:AI&a…

记录安装pdsh中 Linux 系统根目录空间不足导致的编译安装问题

解决 Linux 系统根目录空间不足导致的编译安装问题 问题描述 在 Ubuntu 系统上编译安装 pdsh-2.29 时,由于根目录空间不足,导致 configure 过程中出现以下错误: ./configure: line 1197: cannot create temp file for here-document: No s…

位图的深入解析:从数据结构到图像处理与C++实现

在学习优选算法课程的时候,博主学习位运算了解到位运算的这个概念,之前没有接触过,就查找了相关的资料,丰富一下自身,当作课外知识来了解一下。 位图(Bitmap)是一种用于表示图像的数据结构&…

【Matlab优化算法-第14期】基于智能优化算法的VMD信号去噪项目实践

基于智能优化算法的VMD信号去噪项目实践 一、前言 在信号处理领域,噪声去除是一个关键问题,尤其是在处理含有高斯白噪声的复杂信号时。变分模态分解(VMD)作为一种新兴的信号分解方法,因其能够自适应地分解信号而受到…

python连点器

要实现一个用于抖音点赞的鼠标连点工具,可以通过编程或现有软件实现。以下是两种常见方法(但请注意:频繁自动化操作可能违反平台规则,需谨慎使用): 方法 1:使用现成工具(如 AutoClic…

8.JVM-方法区

前言 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理 栈、堆、方法区的交互关系 下面就涉及了对象的访问定位 Person&a…

C++:将函数参数定义为const T的意义

C++很多函数的参数都会定义为const T&,那么这么做的意义是什么呢? 避免拷贝:通过引用传递参数而不是值传递,可以避免对象的拷贝,从而提高性能,特别是当对象较大时。 保护数据:使用const关键字可以防止函数修改传入的参数,确保数据的安全性和一致性。 对于保护数据这…

大模型训练(7):集合通信与通信原语

0 背景 分布式训练过程中设计到许多通信上的操作, 每个操作有其不同的术语并且有所区别,这里将其用简单的例子和描述总结一下,方便理解。 集合通信(Collective Communications)是一个进程组的所有进程都参与的全局通…

全程Kali linux---CTFshow misc入门(38-50)

第三十八题: ctfshow{48b722b570c603ef58cc0b83bbf7680d} 第三十九题: 37换成1,36换成0,就得到长度为287的二进制字符串,因为不能被8整除所以,考虑每7位转换一个字符,得到flag。 ctfshow{5281…

计算机视觉的研究方向、发展历程、发展前景介绍

以下将分别从图像分类、目标检测、语义分割、图像分割(此处应主要指实例分割)四个方面,为你介绍研究生人工智能计算机视觉领域的应用方向、发展历程以及发展前景。 文章目录 1.图像分类应用方向发展历程发展前景 2.目标检测应用方向发展历程…

Android性能优化

Android性能优化 如何优化一个包含大量图片加载的Android应用,以提高性能和用户体验? 优化一个包含大量图片加载的Android应用,可以从以下几个方面入手,以提高性能和用户体验: 选择合适的图片加载库 使用成熟的图片…

C++Primer学习(2.2)

2.2 变量 变量提供一个具名的、可供程序操作的存储空间。C中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。对C程序员来说,“变量(variable)”和“对象(object)”一般可以互换使用。 术…

49-拓展(1)

49-拓展(1) 扩展概述 扩展可以为在当前 package 可见的类型(除函数、元组、接口)添加新功能。 当不能破坏被扩展类型的封装性,但希望添加额外的功能时,可以使用扩展。 可以添加的功能包括: …

Maven 安装配置(完整教程)

文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型(POM)的项目管理和自动化构建工具。它主要服务于 Java 平台,但也支持其他编程语言…

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…

25寒假周报1,2

cf是“可怜楼上月徘徊” PTA是“有心栽花花不开” 牛客是“独钓寒江雪” (补题链接) 周报一 复习了一下一些基础算法,高级算法没补到。 debug的时候思路一定要清晰,梳理枝节 周报二 做了线段树,莫队&#…

C++病毒

第一期 声明&#xff1a; 仅供损害电脑&#xff0c;不得用于非法。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook; LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam) {if (nCode HCBT_ACTI…

DeepSeek为何能爆火

摘要&#xff1a;近年来&#xff0c;DeepSeek作为一款新兴的社交媒体应用&#xff0c;迅速在年轻人群体中走红&#xff0c;引发了广泛关注。本文旨在探讨DeepSeek为何能在短时间内爆火&#xff0c;从而为我国社交媒体的发展提供参考。首先&#xff0c;通过文献分析&#xff0c;…

数据分析如何做EDA

探索性数据分析&#xff08;EDA&#xff0c;Exploratory Data Analysis&#xff09;是数据分析过程中至关重要的一步&#xff0c;其目的是通过统计和可视化技术对数据进行初步分析&#xff0c;从而揭示数据的潜在模式、特征和异常值&#xff0c;并为后续的数据预处理、特征工程…