【python】Python操作Redis数据库的详细教程与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑
文章目录
- Python中操作Redis的详细用法教程
- 引言
- 安装redis-py库
- 连接到Redis服务器
- 连接到本地Redis服务器
- 连接到远程Redis服务器
- 数据操作
- 键值对操作
- 设置键值对
- 获取键值对
- 检查键是否存在
- 删除键
- 批量操作
- 哈希表操作
- 存储哈希表
- 获取哈希表中的值
- 删除哈希表字段
- 获取哈希表中的所有字段和值
- 列表操作
- 向列表添加元素
- 获取列表中的元素
- 移除列表中的元素
- 集合操作
- 添加元素到集合
- 获取集合中的所有元素
- 集合运算
- 有序集合操作
- 添加元素到有序集合
- 获取有序集合中的元素
- 移除有序集合中的元素
- 事务
- 使用Pipeline模拟事务
- 订阅与发布
- 发布消息
- 订阅消息
- 管道(Pipeline)
- 持久化与备份
- 总结
Python中操作Redis的详细用法教程
引言
Redis是一个高性能的键值存储数据库,支持多种类型的数据结构,如字符串、哈希表、列表、集合和有序集合等。由于其高效的读写速度和丰富的数据类型支持,Redis被广泛应用于缓存、消息队列、会话管理等多种场景。在Python中,通过redis-py
库可以方便地操作Redis数据库。本文将详细介绍如何在Python代码中操作Redis,并结合实际案例进行说明。
安装redis-py库
首先,你需要确保已经安装了redis-py
库。如果还没有安装,可以通过pip进行安装:
pip install redis
安装完成后,你就可以在Python代码中导入并使用redis
模块了。
连接到Redis服务器
在Python中操作Redis的第一步是连接到Redis服务器。redis-py
提供了Redis
和StrictRedis
两个类来实现这一功能。StrictRedis
类用于实现大部分官方的Redis命令,并遵循官方的语法和命令;而Redis
类是StrictRedis
的子类,用于向后兼容旧版本的redis-py
库。
连接到本地Redis服务器
import redis# 使用StrictRedis连接到本地Redis服务器,默认端口为6379
r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)# 或者使用Redis类(二者在大多数情况下可以互换使用)
# r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)# 注意:设置decode_responses=True可以让返回的字符串数据以Python字符串形式存在,而不是默认的字节类型
连接到远程Redis服务器
如果你需要连接到远程Redis服务器,只需将host
参数改为远程服务器的IP地址或域名即可,同时可能需要指定密码和端口:
r = redis.StrictRedis(host='192.168.xxx.xxx', port=16379, password='your_password', db=0, decode_responses=True)
数据操作
键值对操作
键值对是Redis中最基本的数据类型。下面将介绍如何在Python中操作键值对。
设置键值对
使用set
方法可以设置键值对:
r.set('mykey', 'myvalue')
获取键值对
使用get
方法可以获取键对应的值:
value = r.get('mykey')
print(value) # 输出: myvalue
检查键是否存在
使用exists
方法可以检查键是否存在:
exists = r.exists('mykey')
print(exists) # 输出: True 或 False
删除键
使用delete
方法可以删除键及其对应的值:
deleted = r.delete('mykey')
print(deleted) # 输出: 1 表示删除成功
批量操作
redis-py
还提供了批量设置和获取键值对的方法:
mset
方法用于同时设置多个键值对:
r.mset({'key1': 'value1', 'key2': 'value2', 'key3': 'value3'})
mget
方法用于同时获取多个键的值:
values = r.mget('key1', 'key2', 'key3')
print(values) # 输出: [b'value1', b'value2', b'value3']
注意:由于设置了decode_responses=True
,在上面的例子中,我们期望输出的是字符串列表['value1', 'value2', 'value3']
,但出于示例的通用性,这里保留了字节类型的输出。
哈希表操作
哈希表(Hashes)是Redis中的另一种数据结构,可以存储多个字段和值对。
存储哈希表
使用hset
方法可以向哈希表中添加字段和值:
r.hset('myhash', 'field1', 'value1')
r.hset('myhash', 'field2', 'value2')
获取哈希表中的值
使用hget
方法可以获取哈希表中指定字段的值:
field_value = r.hget('myhash', 'field1')
print(field_value) # 输出: value1
删除哈希表字段
使用hdel
方法可以删除哈希表中的字段:
deleted_count = r.hdel('myhash', 'field1')
print(deleted_count) # 输出: 1 表示成功删除一个字段
获取哈希表中的所有字段和值
使用hgetall
方法可以获取哈希表中的所有字段和值:
all_fields_values = r.hgetall('myhash')
print(all_fields_values) # 输出: {'field2': 'value2'}(注意:实际输出会根据哈希表中的内容而定)
列表操作
列表(Lists)是Redis中用于存储字符串列表的简单数据结构。列表是有序的,可以向列表的头部或尾部添加元素。
向列表添加元素
- 使用
rpush
方法向列表的尾部添加元素:
r.rpush('mylist', 'item1', 'item2')
- 使用
lpush
方法向列表的头部添加元素:
r.lpush('mylist', 'item0')
获取列表中的元素
- 使用
lrange
方法可以获取列表中的元素,该方法接受起始索引和结束索引作为参数:
items = r.lrange('mylist', 0, -1) # 获取列表中的所有元素,-1 表示列表的最后一个元素
print(items) # 输出: ['item0', 'item1', 'item2']
移除列表中的元素
- 使用
lpop
方法移除并返回列表的第一个元素:
first_item = r.lpop('mylist')
print(first_item) # 输出: item0
- 使用
rpop
方法移除并返回列表的最后一个元素:
last_item = r.rpop('mylist')
print(last_item) # 输出: item2
集合操作
集合(Sets)是Redis中的无序字符串集合,具有唯一性,不允许有重复的元素。
添加元素到集合
使用sadd
方法可以向集合中添加元素:
r.sadd('myset', 'member1', 'member2')
获取集合中的所有元素
使用smembers
方法可以获取集合中的所有元素:
members = r.smembers('myset')
print(members) # 输出: {'member1', 'member2'}(注意:集合是无序的,所以每次输出的顺序可能不同)
集合运算
Redis支持多种集合间的运算操作,如并集(sunion
)、交集(sinter
)和差集(sdiff
)等。
# 假设有另一个集合
r.sadd('anotherset', 'member1', 'member3')# 获取两个集合的并集
union_members = r.sunion('myset', 'anotherset')
print(union_members) # 输出: {'member1', 'member2', 'member3'}# 获取两个集合的交集
intersect_members = r.sinter('myset', 'anotherset')
print(intersect_members) # 输出: {'member1'}# 获取第一个集合与第二个集合的差集
diff_members = r.sdiff('myset', 'anotherset')
print(diff_members) # 输出: {'member2'}
有序集合操作
有序集合(Sorted Sets)是Redis中的一种数据结构,它在集合的基础上为每个元素关联了一个浮点数分数(score),使得集合中的元素可以按照分数进行排序。
添加元素到有序集合
使用zadd
方法可以向有序集合中添加元素及其分数:
r.zadd('mysortedset', {'member1': 1, 'member2': 2})
获取有序集合中的元素
- 使用
zrange
方法可以按照分数从小到大的顺序获取有序集合中的元素:
members_with_scores = r.zrange('mysortedset', 0, -1, withscores=True)
print(members_with_scores) # 输出: [('member1', 1.0), ('member2', 2.0)]
- 使用
zrevrange
方法可以按照分数从大到小的顺序获取有序集合中的元素:
members_with_scores_reversed = r.zrevrange('mysortedset', 0, -1, withscores=True)
print(members_with_scores_reversed) # 输出: [('member2', 2.0), ('member1', 1.0)]
移除有序集合中的元素
使用zrem
方法可以从有序集合中移除一个或多个元素:
removed_count = r.zrem('mysortedset', 'member1')
print(removed_count) # 输出: 1 表示成功移除了一个元素
事务
Redis支持简单的事务,通过multi
、exec
、discard
和watch
命令来实现。在Python中使用redis-py
库时,可以通过pipeline
来模拟事务的行为。
使用Pipeline模拟事务
pipe = r.pipeline()
try:pipe.multi()pipe.set('key1', 'value1')pipe.set('key2', 'value2')pipe.execute() # 执行事务
except redis.exceptions.RedisError as e:print(f"事务执行失败: {e}")pipe.reset() # 取消事务中的所有命令
注意:Redis中的事务并不支持原子性操作中的回滚(rollback)功能,一旦事务中的某个命令执行失败,之前所有成功执行的命令也不会被撤销。因此,在实际应用中,需要根据业务逻辑来确保事务中的每个命令都能成功执行。
订阅与发布
Redis的发布/订阅(Pub/Sub)模式允许客户端订阅一个或多个频道(channel),以便从这些频道接收消息。消息发布者向指定的频道发送消息,所有订阅了该频道的客户端都会接收到这条消息。
发布消息
使用publish
方法可以向指定的频道发布消息:
r.publish('mychannel', 'Hello, Redis!')
订阅消息
在Python中使用redis-py
库订阅消息时,通常需要使用一个单独的连接(或连接池中的一个连接)来监听消息。由于订阅操作是阻塞的,因此通常会在一个单独的线程或进程中执行。
import redis
import threadingdef listener(r, channel):pubsub = r.pubsub()pubsub.subscribe(channel)for message in pubsub.listen():if message['type'] == 'message':print(f"Received {message['data']} on {message['channel']}")# 创建一个Redis连接
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)# 创建一个线程来订阅消息
thread = threading.Thread(target=listener, args=(r, 'mychannel'))
thread.daemon = True
thread.start()# 在主线程中发布消息
r.publish('mychannel', 'Hello from the main thread!')# 注意:由于订阅操作是阻塞的,上面的代码在发布消息后不会立即退出。
# 在实际应用中,你可能需要一种方式来优雅地关闭监听线程。
管道(Pipeline)
除了用于模拟事务外,pipeline
还可以用来批量执行命令,以减少网络开销。通过将多个命令打包到一个pipeline
中,然后一次性发送给Redis服务器执行,可以显著提高性能。
pipe = r.pipeline()
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.execute() # 批量执行命令
持久化与备份
虽然redis-py
库主要用于在Python代码中操作Redis,但了解Redis的持久化和备份机制对于保证数据的安全性和可靠性也非常重要。Redis提供了RDB(Redis Database)和AOF(Append Only File)两种持久化方式,以及手动快照和命令备份等方法。
- RDB:通过定期将内存中的数据快照保存到磁盘上来实现持久化。
- AOF:通过记录每次写操作命令到文件中,并在服务器重启时重新执行这些命令来恢复数据。
请注意,这些持久化和备份操作通常是在Redis服务器层面进行配置的,而不是在redis-py
客户端库中。
总结
通过上述内容的介绍,你应该已经对在Python中使用redis-py
库操作Redis数据库有了全面的了解。从基本的键值对操作到复杂的数据结构(如哈希表、列表、集合和有序集合)的使用,再到事务、订阅/发布模式以及管道等高级特性的应用,redis-py
库为Python开发者提供了强大的Redis操作能力。希望这篇教程能帮助你更好地利用Redis来优化你的应用程序。
相关文章:

【python】Python操作Redis数据库的详细教程与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
【数据结构的——红黑树】
目录 一、红黑树简介二、红黑树的特性三、2-3-4树与红黑树的等价关系四、红黑树的操作4.1、旋转操作4.2、红黑树的插入4.2.1、情形一4.2.2、情形二4.2.3、情形三4.2.4、情形四4.2.5、情形五4.2.6、情形六4.2.7、对插入进行小结4.3、红黑树的删除4.3.1、情形一4.3.2、情形二4.3.…...

第十二章:设置pod和容器权限-保障集群内节点和⽹络安全
本章内容包括: 在pod中使用宿主机节点的默认Linux命名空间以不同用户身份运行容器运行特权容器添加或禁用容器内核功能定义限制pod行为的安全策略保障pod的网络安全 谈到了如何保障API服务器的安全。如果攻击者获得了访问API服务器的权限,他们可以通过在…...
灵途科技再度入选2024年度“光谷瞪羚”企业名单!
今年5月,东湖高新区启动了2024年度“光谷瞪羚”企业认定工作,共有549家企业拟被认定为“光谷瞪羚”企业。作为泛自动驾驶领域光电感知专家,灵途科技凭借其快速成长、强大创新能力和巨大发展潜力,再次获得“光谷瞪羚”企业的荣誉。…...

Centos7.6配置阿里云镜像源
1、备份本地镜像源,将/etc/yum.repos.d/下所有文件备份到/etc/yum.repos.d/bak/下 2、下载阿里云镜像 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 3、清除yum缓存-yum clean all 4、验证镜像源仓库 yum repolist...
梨子的功效与作用 梨子生吃熟吃功效竟大不同
梨,这一寻常的水果,因其独特的口感和丰富的营养价值,深受人们的喜爱。梨子不仅味道甜美,而且具有多种功效与作用,无论是生吃还是熟吃,都能给人体带来诸多益处。然而,你是否知道,生吃…...

北斗三号5G遥测终端机系统在水库大坝安全监测应用
一、概述 我国现有水库大坝9.8万余座,是世界上拥有水库大坝最多的国家。这些水库大坝在防洪、发电、供水、灌溉等方面发挥巨大效益的同时,所存在的安全风险不容忽视。大坝安全监测是大坝安全管理的重要内容,是控制大坝风险的重要措施。大坝安…...

代码随想录算法训练营第五十一天|99.岛屿数量 深搜 、99.岛屿数量 广搜、岛屿的最大面积
#99. 岛屿数量 深度优先搜索: 每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 本题思路:用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋…...
【c++刷题笔记-图论】day62:Floyd 算法、A * 算法精讲
Floyd 算法 重点:多源最短路径算法,前的最短路径算法是单源的也就是只有一个起点。递推每个节点之间最短的路径 时间复杂度: O(n^3)空间复杂度:O(n^2) #include <iostream> #include <vector> using namespace std…...

FPGA知识基础之--clocking wizard ip核的使用以及modelsim与vivado联合仿真
目录 前言一、ip核是什么?1.1 定义1.2 分类 二、为什么使用ip核2.1 ip核的优点2.2 ip核的缺点 三、如何使用ip核(vivado)四、举例(clocking wizard ip核)4.1 简介4.2 实验任务4.3 程序设计4.3.1 系统模块4.3.2 波形绘制…...
Java中的分布式日志与追踪
随着微服务架构的流行,分布式系统变得越来越复杂。在分布式系统中,日志和追踪是两个关键的工具,用于监控系统的健康状态、故障排除和性能优化。本文将详细探讨Java中的分布式日志与追踪,介绍相关的技术和工具,并通过代…...

案例精选 | 某省级妇幼保健院自动化安全运营中心建设成功实践
某省级妇幼保健院,是一所集医疗、保健、教学、科研、预防、康复于一体的省级三级甲等妇幼保健机构,专注于为全省妇女儿童提供全方位、高质量的医疗保健服务。医院拥有4个院区,总建筑面积10万平米,开放床位700张,年门诊…...

数字化时代:传统行业的转型之路在何方?
在当前数字化时代的浪潮中,传统行业面临着新挑战与新机遇。为了在激烈的市场竞争中立足并谋求发展,传统行业的运营必须积极拥抱数字化转型。蚓链数字化解决方案帮助你总结如下。 数字化思维:开启转型之门的钥匙 数字化思维是传统行业转型的…...

【STM32系统】基于STM32设计的按键PWM控制舵机窗帘柜子门禁家居等控制系统——文末资料下载
演示视频 基于stm32设计的按键PWM控制舵机窗帘&柜子&门禁&家居等控制系统——完整资料下载 摘要 随着智能家居技术的不断发展,舵机在自动化家居设备中的应用变得越来越广泛。本文设计并实现了一种基于STM32单片机的按键PWM控制舵机系统。通过按键可以精…...

【生成式人工智能-八-大型语言模型的能力评估】
语言模型的能力评估 评估难度来自哪里输出没办法确定给出选择题本身就没标准答案 评估方法人力用语言模型来评估语言模型语言模型的偏爱 评估语言模型的数据集评估模型的不同能力阅读长文的能力心智测验道德性测试安全性测试 通常情况下我们想到的语言模型能力评估,…...
Qt ts文件详解
Qt ts文件(Translation Source file:翻译源文件)是Qt框架中用于存储翻译文本和相关上下文信息的一种特定格式文件,它是Qt Linguist(语言家)工具使用的基础。Qt Linguist是Qt开发工具包中的一个应用程序&…...

操作系统 IO 相关知识
操作系统 IO 相关知识 阻塞与非阻塞同步与异步IO 和系统调用传统的 IODMAmmap 内存映射sendfilesplice 常用的 IO 模型BIO:同步阻塞 IONIO:同步非阻塞 IOIO 多路复用信号驱动 IOAIO:异步 IO 模型 IO 就是计算机内部与外部进行数据传输的过程&…...
C++_手写share_ptr
以下是一个简化版的 shared_ptr 的实现: #include <iostream> template <typename T> class SimpleSharedPtr { public:// 构造函数explicit SimpleSharedPtr(T* ptr nullptr) : ptr_(ptr), count_(ptr ? new size_t(1) : nullptr) {}// 拷贝构造函数…...

【启明智显方案分享】6.86寸高清显示屏音频效果器解决方案
一、项目概述 本方案旨在设计一款集成6.86寸高清触摸显示屏的音频效果器,通过HMI(Human-Machine Interface)芯片Model 4驱动,实现高清晰度的视觉交互。该设备不仅支持音乐、麦克风及温响音量的精细控制,还内置丰富的预…...

vue设置每次加载页面时展示一个双开门效果
一、首先创建一个双开门的蒙层组件 <!-- DoorOverlay.vue --> <template><div v-if"isVisible" class"door-overlay"><div class"door left-door"></div><div class"door right-door"></div&…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...