Python--Redis实战:第三章:Redis命令:第二节:列表

news/2024/2/29 4:23:13
上一篇文章: Python--Redis实战:第三章:Redis命令:第一节:字符串
下一篇文章:Python--Redis实战:第三章:Redis命令:第三节:集合

在之前我们介绍过,Redis的列表允许用户从序列的两端推入或者弹出元素、获取列表元素、以及执行各种常见的列表操作。除此之外,列表还可以用来存储任务信息、最近浏览过的文章、常用联系人信息。

本节将对列表这个由多个字符串组成的有序序列结构进行介绍,并展示一些最常用的列表处理命令。

下表展示了常用的列表命令:

命令用例用例描述
rpushrpush key-name value [value ...]将一个或多个值推入列表的右端
lpushlpush key-namr value [value ...]将一个或多个值推入列表的左端
rpoprpop key-name移除并返回列表最右端的元素
lpoplpop key-name移除并返回列表最左端的元素
lindexlindex key-name offset返回列表中偏移量为offset的元素
lrangelrange key-name start end返回列表从start偏移量到end偏移量范围内的所有元素,其中偏移量为start和偏移量为end的元素也会包含在被返回的元素之内。
ltrimltrim key-name start end对列表进行修剪,只保留从strat偏移量到end偏移量范围内的元素,其中偏移量为start何偏移量为end的元素也会被保留。

之前已经对列表的几个推入和弹出操作进行了简单的介绍,所以我们应该不会对上面的命令陌生。

列表推入、弹出操作实例

import redis #导入redis包包#与本地redis进行链接,地址为:localhost,端口号为6379
r=redis.StrictRedis(host='localhost',port=6379)
r.delete('list-key')#推入操作完成之后会返回列表当前的长度
#从语义上来说,列表的左端为开头,右端为结尾
print(r.rpush('list-key','last'))print(r.lpush('list-key','first'))print(r.rpush('list-key','new last'))print(r.lrange('list-key',0,-1))#通过重复的弹出列表左端的元素,可以按照从左到右的顺序来获取列表中的元素
print(r.lpop('list-key'))
print(r.lpop('list-key'))print(r.lrange('list-key',0,-1))#可以同时推入多个元素
print(r.lpush('list-key','a','b','c'))
print(r.lrange('list-key',0,-1))#可以从列表的左端、右端或者左右两端删减任意数量的元素
print(r.ltrim('list-key',2,-1))
print(r.lrange('list-key',0,-1))

运行结果:

1
2
3
[b'first', b'last', b'new last']
b'first'
b'last'
[b'new last']
4
[b'c', b'b', b'a', b'new last']
True
[b'a', b'new last']

这个实例里面第一次使用到了ltrim命令,聚合使用ltrim和lrange可以构建出一个在功能上类似于lpop或rpop,但是却能够一次返回并弹出多个元素的操作。本章稍后将会介绍【原子地】执行多个命令的方法,而更高级的Redis事务特性则会在下一章介绍。

在Redis里面,多个命令原子地执行指的是:在这些命令正在读取或者修改数据的时候,其他客户端不能读取或者修改相同的数据。

有几个列表命令可以将元素从一个列表移动到另一个列表,或者阻塞【block】执行命令的客户端直到有其他客户端给列表添加元素为止,这些命令之前都没有介绍过,下表列出了这些阻塞弹出命令和元素移动命令:

命令用例用例描述
blpopblpop key-name [key-name ...] timeout从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现。
brpopbrpop key-name [key-name ...] timeout从第一个非空列表中弹出位于最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现。
rpoplpushrpoplpush source-key dest-key从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素。
brpoplpushbrpoplpush source-key dest-key timeout从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素;如果source-key为空,那么在timeout秒之内阻塞并等待可弹出的元素出现。

使用brpoplpush移动列表元素、使用blpop从列表中弹出多个元素的实例

import redis #导入redis包包#与本地redis进行链接,地址为:localhost,端口号为6379
r=redis.StrictRedis(host='localhost',port=6379)
r.delete('list-key1')
r.delete('list-key2')#将一些元素添加到两个列表里面
print(r.rpush('list-key1','item1'))
print(r.rpush('list-key1','item2'))
print(r.rpush('list-key2','item3'))#将一个元素从一个列表移动到另一个列表,并返回被移动的元素
print(r.brpoplpush('list-key2','list-key1',1))
#当列表不包含任何元素时,阻塞弹出操作会在给定的期限内等待可弹出的元素出现,并在时限到达后返回None
print(r.brpoplpush('list-key2','list-key1',1))
print(r.lrange('list-key1',0,-1))
print(r.lrange('list-key2',0,-1))#blpop命令会从左到右地检查传入到列表,并对最先遇到的非空列表执行弹出操作
print(r.blpop(['list-key1','list-key2'],1))
print(r.blpop(['list-key1','list-key2'],1))
print(r.blpop(['list-key1','list-key2'],1))

运行结果:

图片描述

对于阻塞弹出命令和弹出并推入命令,最常见的用例就是消息传递【messaging】和任务队列【task queue】,这将在后面讲解。

列表的一个主要优点在于它可以包含多个字符串值,这使得用户可以将数据集中在同一个地方。Redis的集合也提供了与列表类似的特性,但集合中能保存各不相同的元素。接下来的一节中就让我妈来看看不能保存相同元素的集合都能做些什么?

上一篇文章: Python--Redis实战:第三章:Redis命令:第一节:字符串
下一篇文章:Python--Redis实战:第三章:Redis命令:第三节:集合

https://www.jiucaihua.cn/news/show-4293793.html

相关文章

敲黑板,2023年软考各科目考试时间安排已确定

刚刚,中国计算机技术职业资格网发布了《2023年度计算机技术与软件专业技术资格(水平)考试工作计划》,具体见下文。 2023年度计算机软件资格考试(初级、中级、高级)上半年考试日期为5月27日、28日&#xff…

2023的软考考生们,上岸的机会来了

2023年上半年软考将于三月中旬陆续开始报名,大家一定要记得报名哦。 报名条件:凡遵守中华人民共和国宪法和各项法律,恪守职业道德,具有一定计算机技术应用能力的人员,均可根据本人情况,报名参加相应专业类…

Redis学习笔记1--入门篇

2019独角兽企业重金招聘Python工程师标准>>> Redis学习笔记1--入门篇 一、Redis简介: Redis(http://redis.io)是一款开源的、高性能的键-值存储(key-value store),它是用ANSI C来编写。Redis的项…

最火的前端开发框架Bootstrap使用教程

2019独角兽企业重金招聘Python工程师标准>>> Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript 开发的简洁、直观、强悍的前端开发框架,使得 Web 开发更加快捷。Bootstrap提供了优雅的HTML和CSS规范&#xff…

什么是完全备份,差异备份,增量备份

首先说一下什么是存档属性“存档”属性表示此文件、文件夹的备份属性,只是提供给备份程序使用,当未选中时,备份程序就会认为此文件已经“备份过”,可以不用再备份了。 所以,当备份程序备份了一个文件时,默…

30443数据查询语言DQL

5.4 SQL的数据查询功能 数据查询是数据库最常用的功能。在关系数据库中,查询操作是由SELECT语句来完成。其语法格式如下: SELECT column_expressionFROM table_name | view_name[,table_name | view_name, [,…]] [IN foreign_TABLE][WHERE... ][GROUP B…

软考纸质证书领取通知又双叒叕来了

不少朋友都在关注2022下半年软考证书领取时间,截止至目前,上海、湖北、江苏、南京、安徽、山东、浙江、宁波、江西、贵州、云南、辽宁、大连、吉林、广西地区的纸质证书可以领取了。 ​ ​将持续更新2022下半年软考纸质证书领取时间,请大…

Android使用Gradle命令动态传参完成打包,不需要修改代码

不得不说,Gradle很强大,有人会问Gradle是什么?这里也不细讲,在我认为他就是一个构建神器。Gradle 提供了: 一个像 Ant 一样的非常灵活的通用构建工具一种可切换的, 像 Maven 一样的基于合约构建的框架支持强大的多工程构建支持强大…

HD90假钞辨别攻略:“一看二摸三听四测”

HD90假钞辨别攻略:“一看二摸三听四测” 百元假钞 HD90打头假钞票面及细节图 针对全国多个地方发现“HD90”编号的百元假币的报道,中国人民银行货币金银局局长叶英男昨天表示,不能简单地从字母和数字的搭配判断人民币的真假,不能…

关于channel的一些坑

channel可以分为无缓冲和带缓冲的通道 无缓冲的&#xff0c;必须要一个协程发送&#xff0c;一个协程接收 package mainfunc main() {var ch make(chan int)ch <- 1<- ch }在主协程main&#xff0c;执行到 ch <- 1&#xff0c;即发送完消息就阻塞了。 下一句 <- c…