当前位置: 首页 > news >正文

【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提供了RedisStrictRedis两个类来实现这一功能。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支持简单的事务,通过multiexecdiscardwatch命令来实现。在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 算法 重点&#xff1a;多源最短路径算法&#xff0c;前的最短路径算法是单源的也就是只有一个起点。递推每个节点之间最短的路径 时间复杂度&#xff1a; O(n^3)空间复杂度&#xff1a;O(n^2) #include <iostream> #include <vector> using namespace std…...

FPGA知识基础之--clocking wizard ip核的使用以及modelsim与vivado联合仿真

目录 前言一、ip核是什么&#xff1f;1.1 定义1.2 分类 二、为什么使用ip核2.1 ip核的优点2.2 ip核的缺点 三、如何使用ip核&#xff08;vivado&#xff09;四、举例&#xff08;clocking wizard ip核&#xff09;4.1 简介4.2 实验任务4.3 程序设计4.3.1 系统模块4.3.2 波形绘制…...

Java中的分布式日志与追踪

随着微服务架构的流行&#xff0c;分布式系统变得越来越复杂。在分布式系统中&#xff0c;日志和追踪是两个关键的工具&#xff0c;用于监控系统的健康状态、故障排除和性能优化。本文将详细探讨Java中的分布式日志与追踪&#xff0c;介绍相关的技术和工具&#xff0c;并通过代…...

案例精选 | 某省级妇幼保健院自动化安全运营中心建设成功实践

某省级妇幼保健院&#xff0c;是一所集医疗、保健、教学、科研、预防、康复于一体的省级三级甲等妇幼保健机构&#xff0c;专注于为全省妇女儿童提供全方位、高质量的医疗保健服务。医院拥有4个院区&#xff0c;总建筑面积10万平米&#xff0c;开放床位700张&#xff0c;年门诊…...

数字化时代:传统行业的转型之路在何方?

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

【STM32系统】基于STM32设计的按键PWM控制舵机窗帘柜子门禁家居等控制系统——文末资料下载

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

【生成式人工智能-八-大型语言模型的能力评估】

语言模型的能力评估 评估难度来自哪里输出没办法确定给出选择题本身就没标准答案 评估方法人力用语言模型来评估语言模型语言模型的偏爱 评估语言模型的数据集评估模型的不同能力阅读长文的能力心智测验道德性测试安全性测试 通常情况下我们想到的语言模型能力评估&#xff0c;…...

Qt ts文件详解

Qt ts文件&#xff08;Translation Source file&#xff1a;翻译源文件&#xff09;是Qt框架中用于存储翻译文本和相关上下文信息的一种特定格式文件&#xff0c;它是Qt Linguist&#xff08;语言家&#xff09;工具使用的基础。Qt Linguist是Qt开发工具包中的一个应用程序&…...

操作系统 IO 相关知识

操作系统 IO 相关知识 阻塞与非阻塞同步与异步IO 和系统调用传统的 IODMAmmap 内存映射sendfilesplice 常用的 IO 模型BIO&#xff1a;同步阻塞 IONIO&#xff1a;同步非阻塞 IOIO 多路复用信号驱动 IOAIO&#xff1a;异步 IO 模型 IO 就是计算机内部与外部进行数据传输的过程&…...

C++_手写share_ptr

以下是一个简化版的 shared_ptr 的实现&#xff1a; #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寸高清触摸显示屏的音频效果器&#xff0c;通过HMI&#xff08;Human-Machine Interface&#xff09;芯片Model 4驱动&#xff0c;实现高清晰度的视觉交互。该设备不仅支持音乐、麦克风及温响音量的精细控制&#xff0c;还内置丰富的预…...

vue设置每次加载页面时展示一个双开门效果

一、首先创建一个双开门的蒙层组件 <!-- DoorOverlay.vue --> <template><div v-if"isVisible" class"door-overlay"><div class"door left-door"></div><div class"door right-door"></div&…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...