Redis:list类型

文章目录

  • list
  • 常见命令
    • lpush
    • lrange
    • lpushx
    • rpush
    • rpushx
    • lpop和rpop
    • lindex
    • linsert
    • llen
    • lrem
    • ltrim
    • lset
  • 阻塞版本命令
    • blpop

list

初步认识

在Redis中,对于list这种数据类型来说,更像是一种数组或者是顺序表,下面展示其最基本的用法

在这里插入图片描述
值得注意的是,在list内部的实现方式中,也就是我们之前所提及的编码方式,对于list这种数据类型来说其实底层不是一个简单的数组,而是更加类似于一种双端队列的方式来进行实现,这样就能很好的实现头插和头删尾插和尾删的操作了

对于list来说,我们约定最左侧的元素下标是0,也可以是负数,从-1开始从右向左逐渐递减

有序?

list当中的元素是有序的,对于有序这个词来说,其实有很多种含义,如果我们说此时的有序说的是升序或者降序,那么就是说这个数组中的数据突出的是按照递增还是递减,而又有时候我们说的是有序指的是顺序很关键,那么想要突出的重点是,当数组中的元素顺序进行交换之后,就会导致整个数组的并不和原来的数组等价,这是两种不同的概念

获取和删除

在list当中,会有两种方式来返回被删除的元素,一种是lindex,表示的是获取到元素的值,而lrem表示的是删除元素,此时也会返回出被删除元素的值,但是这两个虽然都能进行值的返回,但是并不相同,下面演示这两种最基本的使用方式:

127.0.0.1:6379> lpush key1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lindex key1 3
"2"

从上面的演示中可以看到,一个比较惊奇的结果是,似乎并不是按照从左向右进行的插入,而更像是从右向左,那么下面就引入Redis中list类型的相关命令

常见命令

lpush

对于这个命令来说,它允许插入一个,也允许插入多个值,并且将会按照顺序头插这4个元素,这也就意味着,当插入结束之后,最开始插入的元素其实是在最后一个位置

所以,对于上述的操作来说,插入的元素是1 2 3 4 5,实际上在list中的标识方式应该是5 4 3 2 1,这是由list的功能特性决定的

如果此时key已经存在,那么key对应的value类型还不是list,此时lpush命令就会报错:

127.0.0.1:6379> set key1 1
OK
127.0.0.1:6379> lpush key1 1 2 3 4 5
(error) WRONGTYPE Operation against a key holding the wrong kind of value

Redis中维护的是键值对,所以即使是list也满足这个要求,在键值对中key值必须是string,不同的数据类型只能说的是value的类型,因此对于key值重复的问题一定是不能被成功插入的,因此在Redis中所有的数据类型都满足这个要求

lrange

在list中还有一个命令叫做lrange:

lrange key start stop

从这个命令也可以看出,它的功能就是表示的是展示某个key值对应的list的某个区间的值

127.0.0.1:6379> lpush key1 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379> lrange key1 1 5
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
127.0.0.1:6379> lrange key1 0 -1
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
6) "4"
7) "3"
8) "2"
9) "1"

当说起下标,就要考虑到越界访问呢的问题,在C++这门语言中,对于越界访问这个问题,其实是一个未定义的行为,但是在Redis中,似乎并不是如此

127.0.0.1:6379> lrange key1 1 100
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
8) "1"

在C++中,对于未定义的行为,可能会导致程序崩溃,或者是不合法的数据,或者是看起来合法,实际上错误的数据,也可能正好得到的是一个符合要求的数据,总的来说,这样的行为是未定义的

而在Redis中,并没有选择这样的方法,它的做法是,尽可能的获取到给定区间的元素,如果给定的区间是非法的,那么就会尽可能获取合法的内容,对于不合法的就不表示

这样做看起来感觉还不错?少了检测的机制,会导致效率提高,但是也有弊端,弊端就是需要程序员自己来排查问题,当出现越界访问的时候Redis本身并不会对你的行为进行提示,这也并不是一个特别完美的解决方案

lpushx

下面说的是lpushx命令:

127.0.0.1:6379> lrange key1 0 -1
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
6) "4"
7) "3"
8) "2"
9) "1"
127.0.0.1:6379> lpushx key1 10 11 12 13 14
(integer) 14
127.0.0.1:6379> lrange key1 0 -1
 1) "14"
 2) "13"
 3) "12"
 4) "11"
 5) "10"
 6) "9"
 7) "8"
 8) "7"
 9) "6"
10) "5"
11) "4"
12) "3"
13) "2"
14) "1"

由上述的执行效果可以看出,对于lpushx来说,其实其本质就是对于已经存在的key值依旧进行头插,而如果此时的list不存在,那么lpushx会直接返回

127.0.0.1:6379> lpushx key3
(error) ERR wrong number of arguments for 'lpushx' command

rpush

上面的lpush,其实是有些反人类直觉的插入元素的方式,毕竟我们更习惯看待的是尾插,那么下面演示的就是尾插:

127.0.0.1:6379> rpush key1 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lrange key1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> rpushx key1 7 8 9
(integer) 9
127.0.0.1:6379> lrange key1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"

rpushx

而对于rpushx来说,和lpushx一样,这里就不多讲述了

lpop和rpop

在当前的Redis 5版本中,是没有count参数的,而从Redis 6.2版本中,新增了一个count参数,这个参数表示的就是要删除几个元素

127.0.0.1:6379> lrange key1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> lpop key1
"1"
127.0.0.1:6379> rpop key1
"9"
127.0.0.1:6379> lrange key1 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
6) "7"
7) "8"

Redis中的list本质上来说就是一个双端队列,从两段进行插入和删除的效率都是O(1),搭配到lpush和lpop以及rpush和rpop,其实已经可以当做栈和队列来使用了,总的来说效率还是非常不错的

lindex

这个命令表示的是,给定一个下标,获取该下标对应的元素,这里的时间复杂度是O(N),其中N表示的是list中元素的个数,如果此时的下标非法,会返回一个nil

127.0.0.1:6379> lrange key1 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
6) "7"
7) "8"
127.0.0.1:6379> lindex key1 3
"5"
127.0.0.1:6379> lindex key1 1111
(nil)

linsert

linsert key BEFORE|AFTER pivot element

这个命令的意思是,在某个值的前面或者后面插入另外一个值,这里我举一个例子

127.0.0.1:6379> linsert key1 before 6 2222
(integer) 8
127.0.0.1:6379> lrange key1 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
5) "2222"
6) "6"
7) "7"
8) "8"

这个意思就是在6之前插入一个2222

那如果在整个列表中有多个基准值该如何处理呢?具体的解决措施是从左向右进行查找,找到第一个符合基准值的位置插入就可以了

llen

llen表示的意思是列表的长度

127.0.0.1:6379> llen key1
(integer) 8
127.0.0.1:6379> llen key0
(integer) 0

lrem

rem的意思是remove,所以意思很明显,就是要移出某个元素

lrem key count element
127.0.0.1:6379> lrem key1 1 2222
(integer) 1
127.0.0.1:6379> lrem key1 2 5
(integer) 1

count表示的是要删除多少个元素,其中返回值表示的是删除成功的个数

ltrim

ltrim key start stop

该命令表示的意思是保留start到stop之间的元素,其他元素全部删除

lset

lset key index element

这个命令的意思是根据下标进行修改元素

阻塞版本命令

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致,但是:

在列表中有元素的情况下,阻塞和非阻塞表现是一致的.但如果列表中没有元素,非阻塞版本会
理解返回0,但阻塞版本会根据超时值,阳塞一段时间,期间Redis可以执行其他命令,但要
求执行该命令的客户端会表现为阻塞状态

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

如果多个客戶端同时多一个键执行POP,则最先执行命令的客戶端会得到弹出的元素

blpop

blpop key [key ...] timeout

此处表示的是可以指定一个key或者多个key,每一个key表示的都是一个list,而对于这些list来说,如果有任何一个是非空的,那么就会把这里的元素获取到,立即返回,这个这些key全部都是空的,那么此时就会在这里进行阻塞等待,直到其他客户端向这些list当中放入元素

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python3 笔记:二进制的转换

十进制是逢十进一,二进制就是逢二进一。 十进制里最大的数字是9,二进制里最大的数字是1。 11010010001000010000010000001000000010^0110^11010^210010^3100010^41000010^510000010^6100000010^7100000002^012^122^242^382^4162^5322^6642^7128 1、十进…

页面布局(H5基础)(上)

元素的显示模式 元素的显示模式 块级元素 页面中独占一行,不会与任何元素公用一行,从上到下排列 宽度默认是元素的高度,高度默认内容撑开 可以通过css设置宽高 行内元素 在页面中不独占一行,一行中不能容纳的行内元素&#x…

CleanMyMac X v4.14.6中文破解版,让您的电脑像新的一样

小编给您带来CleanMyMac X v4.14.6中文破解版,CleanMyMac X破解版是应用在MacOS上的一款Mac系统清理优化工具,使用cleanmymac x 中文破解版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间。 CleanMyMa…

免费SSL证书签发安装指南

一、签发 1.选择证书颁发机构(CA):首先,你需要找到一个提供免费SSL证书的CA。有些CA会提供永久免费的SSL证书,而有些则可能只提供有限时间的试用证书,如JoySSL就提供永久免费证书。 2.生成CSR&#xff08…

Too many packets buffered for output stream 0:0.

错误信息:FFmpeg:Too many packets buffered for output stream 0:0. 解决方案:

CV每日论文--2024.5.15

1、Can Better Text Semantics in Prompt Tuning Improve VLM Generalization? 中文标题:更好的文本语义在提示微调中能否提高视觉语言模型的泛化能力? 简介:这篇论文介绍了一种新的可学习提示调整方法,该方法超越了仅对视觉语言模型进行微调的传统方…

CSS三大选择器

CSS三大选择器 1 元素选择器2 id选择器3 class选择器 1 元素选择器 说明 根据标签名确定样式的作用范围语法为 元素名 {}样式只能作用到同名标签上,其他标签不可用相同的标签未必需要相同的样式,会造成样式的作用范围太大 代码 <head><meta charset"UTF-8&quo…

15.SVG变形 Transform

SVG的transform属性非常强大&#xff0c;它允许你对图形进行平移、缩放、旋转、倾斜等操作。以下是一篇关于SVG图形变形的教程&#xff0c;包括详细的描述和代码示例。 平移(Translate) 平移操作可以将图形从一个位置移动到另一个位置。使用translate(x, y)&#xff0c;其中x和…

在 Django 中获取已渲染的 HTML 文本

在Django中&#xff0c;你可以通过多种方式获取已渲染的HTML文本。这通常取决于你希望在哪个阶段获取HTML文本。下面就是我在实际操作中遇到的问题&#xff0c;并且通过我日夜奋斗终于找到解决方案。 1、问题背景 在 Django 中&#xff0c;您可能需要将已渲染的 HTML 文本存储…

如何在VS Code中安装插件并进行中文化。

相关文章推荐: 如何下载和安装Visual Studio Code&#xff08;VSCode&#xff09; 在使用Visual Studio Code&#xff08;简称VS Code&#xff09;进行开发时&#xff0c;安装插件可以极大地提升开发效率和使用体验。而将VS Code插件界面进行中文化&#xff0c;则能更好地满足中…

【编程题-错题集】分割等和子集(动态规划 - 01背包)

牛客对应题目链接&#xff1a;分割等和子集_牛客题霸_牛客网 (nowcoder.com) 力扣对应题目链接&#xff1a;416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 一、分析题目 01 背包 问题&#xff1a;将原问题转换成&#xff1a;从 n 个数中选&#xff0c;总和恰好为…

PPT为何无法复制粘贴?附解决办法!

PPT文件里的内容无法复制&#xff0c;或者复制后无法粘贴&#xff0c;这是怎么回事呢&#xff1f; 这种情况&#xff0c;一般是因为PPT被设置了保护&#xff0c;设置了以“只读方式”打开&#xff0c;就无法进行复制粘贴了。PPT的“只读方式”不同&#xff0c;解决方法也不同&…

在 pyGTK 中使用 visibility_notify 事件

问题背景 在 Windows 系统中开发 pygtk 应用程序时&#xff0c;需要知道何时一个窗口被另一个窗口遮挡或显示&#xff0c;以便停止繁重的绘图进程。为此&#xff0c;可以使用 visibility_notify_event 信号来获取窗口可见性状态的改变。 解决方案 可以使用 visibility_notif…

iRemovalPro完美解4G信号,支持A12+,支持6S~14ProMax,支持iOS17.4+

iRemovalPro是一款绕过激活锁界面的解锁工具&#xff0c;可以激活所有iPhone/ipad恢复信号&#xff0c;并且支持插卡接打电话、收发短信、4G流量上网&#xff0c;支持iCloud登录&#xff0c;有消息通知&#xff0c;支持iPhone6S~14ProMax的所有型号&#xff0c;支持iOS15-iOS17…

腾讯和OpenAI盯上了同一条赛道

图为&#xff1a;腾讯文生图负责人芦清林 AI多模态大模型持续火热&#xff0c;腾讯也出招了 5月14日&#xff0c;腾讯宣布旗下的混元文生图大模型全面升级&#xff0c;该模型采用了与Sora一致的DiT架构&#xff08;Diffusion With Transformer&#xff09;&#xff0c;不仅可支…

在另外一个页面,让另外一个页面弹框显示操作(调佣公共的弹框)vue

大概意思是&#xff0c;登录弹框在另外一个页面中&#xff0c;而当前页面不存在&#xff0c;在当前页面中判断如果token不存在&#xff0c;就弹框出登录的弹框 最后一行 window.location.href … 如果当前用户已登录&#xff0c;则执行后续操作(注意此处&#xff0c;可不要)

FANUC机器人初始化系统的基本方法和步骤

FANUC机器人初始化系统的基本方法和步骤 首先,在做系统初始化之前,必须做好系统的备份,这里做个镜像备份,更详细的镜像备份步骤可参考以下链接中的内容: FANUC机器人进行全部备份和镜像备份以及加载备份文件的具体操作(图文) 如下图所示,在示教器右边的USB接口上插个…

记录用python跑csdn点赞接口

代码如下 # 导入request包 import requests # 请求URL URL3https://blog.csdn.net//phoenix/web/v1/article/like # 入参 data3{articleId:109552419} # 请求头 headers3{cookie:uuid_tt_dd10_30308678820-1713771851124-190368; loginbox_strategy%7B%22taskId%22%3A349%2C%2…

1755jsp学生信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 学生信息管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;…

酷开科技丨女性群像大戏《惜花芷》在酷开系统热播中

在这个国产剧市场蓬勃发展的时代&#xff0c;酷开科技通过其生态智能电视系统&#xff0c;为剧迷们打造了一个精彩的观剧平台。通过酷开科技的智能推荐算法&#xff0c;消费者能够轻松地发掘并观看各种题材的高质量剧集&#xff0c;无论是扣人心弦的金融较量、深刻的家庭代际关…