【python】Python操作Redis数据库的详细教程与应用实战

news2024/9/21 22:51:57

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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 threading

def 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来优化你的应用程序。

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

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

相关文章

三防平板助力MES系统,实现工厂移动式生产报工

在当今竞争激烈的制造业环境中,提高生产效率、优化生产流程以及实现精准的生产管理已经成为企业生存和发展的关键。 MES系统作为连接企业计划层和控制层的桥梁,在实现生产过程的信息化、数字化和智能化方面发挥着重要作用。与此同时,三防平板…

JNPF快速开发平台助力企业实现工作流自动化

随着企业信息化建设的不断深入,工作流自动化已成为提升企业效率、优化业务流程的关键手段。JNPF快速开发平台凭借其强大的功能和灵活的配置,为众多企业提供了实现工作流自动化的高效解决方案。 关于低代码开发平台的普及应用 随着信息技术的迅猛发展&…

高中数学必修一函数部分重难点(上)

高中数学必修一函数部分重难点(上) 本文主要引出映射的概念,明确函数即为映射的一种方式,同时本篇叙述了我在初学时的困难点—定义域等以及当时所觉的难题,最后一图为纯手整理的干货,需要可以留下三联自行取…

Swagger 自动生成 Dubbo 服务的接口文档,以及测试调用

1. 概述 在使用 SpringMVC 构建 HTTP API 时,我们可以通过 Swagger 自动生成 HTTP 接口文档,通过 Swagger UI 界面上进行 HTTP 接口调试。如下图所示: Swagger HTTP 界面 秃头提示:对 Swagger 不太了解的胖友,可以去阅…

论文阅读笔记:Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels

论文阅读笔记:Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels 1 背景2 创新点3 方法4 模块4.1 伪标签4.2 使用不可靠的伪标签 5 效果5.1 与SOTA方法对比5.2 消融实验5.3 定性结果 6 结论 论文:https://arxiv.org/pdf/2203.03884…

北京崇文门中医院贾英才主任:战胜头晕,重获“清醒人生”

头晕,这个看似常见却又恼人的症状,常常让患者的生活陷入困境。在北京崇文门中医院,有个叫贾英才的医生,他凭借医术,给不少头晕患者带去了希望。 北京崇文门中医院贾英才主任在医学领域辛勤耕耘多年,对于头晕…

ubuntu20从docker安装到制作自己的镜像使用记录

ubuntu20从docker安装到制作自己的镜像使用记录 第一章:配置环境 1.ubuntu20 2.docker镜像18.04 3.参考:https://www.runoob.com/docker/docker-tutorial.html 第二章:安装docker 一、安装docker 参考1:Ubuntu安装docker并运…

Spring Cloud微服务项目文件上传/下载

在现代的微服务架构中,文件上传与下载是常见的需求,尤其是在需要处理大量文件数据的系统中。Spring Cloud 提供了灵活的工具和组件,使得在微服务中实现文件上传和下载变得高效而简便。 本文博主将详细介绍如何在 Spring Cloud 微服务项目中实…

【Kubernetes】k8s集群之Pod容器资源限制和三种探针

目录 一、Pod容器的资源限制 1.资源限制 2.Pod 和容器的资源请求与限制 3.CPU 资源单位 4.内存资源单位 二、Pod容器的三种探针 1.探针的三种规则 2.Probe支持三种检查方法: 一、Pod容器的资源限制 1.资源限制 当定义 Pod 时可以选择性地为每个容器设定所…

成都数字产业中心崛起,树莓集团如何加速国际数字影像产业园的全球步伐?

在数字化浪潮的推动下,成都数字产业中心近年来强势崛起,展现出令人瞩目的发展态势。据统计,过去五年间,成都数字产业的年均增长率超过了 20%,这一数据充分证明了其强大的发展动力。而在这片充满活力与创新的土地上&…

数据结构 JAVADS ——部分栈题目分享 (持续更新版)

前言 大概十天前,笔者更新了如何手搓一个简易的栈 入门数据结构JAVA DS ——手搓 栈-CSDN博客 在本篇博客中,笔者就分享几个题目,这同样是一个持续 更新的博客,但是我不保证更新频率就是了 哈哈! 那么我们就来看题目吧 第一题 1.小蓝的括号串1 - 蓝桥云课 (lanqiao.cn) …

如何在 Windows 上设置 MacOS 云主机

在Windows上设置MacOS云主机实际上涉及在Windows环境中模拟或远程管理MacOS系统,因为直接在Windows上运行MacOS作为云主机的主操作系统是不可能的,因为MacOS是为苹果硬件设计的。不过,有几种方法可以实现类似的功能: 1. 使用虚拟机…

Haskell HTTP请求:如何解读响应状态

在互联网技术领域,HTTP请求是客户端与服务器之间通信的基础。无论是网页浏览、API调用还是网络服务的交互,HTTP协议都扮演着核心角色。在本文中,我们将探讨如何在Haskell编程语言中发起HTTP请求,并重点介绍如何解读HTTP响应状态。…

学懂C++ (二十一):高级教程——深入C++多线程开发详解

C多线程开发详解 多线程编程是现代应用程序开发中不可或缺的一部分。C11引入了对多线程的支持,使得程序员能够更方便地利用多核处理器,提高程序的性能和响应能力。本文将全面而深入地探讨C的多线程相关概念,包括线程的创建与管理、互斥量…

PDF怎么在线转Word?介绍四种转换方案

PDF怎么在线转Word?在数字化办公时代,文档的互换性变得尤为重要。PDF格式因其跨平台兼容性和版面固定性而广受欢迎,但有时我们可能需要将PDF文件转换为Word文档,以便进行编辑或进一步处理。以下是四种常见的在线PDF转Word的方法&a…

大数据湖体系规划与建设方案(51页PPT)

方案介绍: 大数据湖通过集中存储各种类型的数据(包括结构化、半结构化和非结构化数据),提供了更加灵活、可扩展的数据处理和分析能力。其核心理念是“存储一切,分析一切,创建所需”,即将所有数…

【论文复现】Transformer

Transformer 前言网络架构数据处理词嵌入向量位置编码 模型定义多头注意力机制编码器Encoder解码器Decoder 前言 Transformer应用范围非常广泛,涵盖了自然语言处理、时间序列数据预测、图像处理等领域。由于笔者之前都是应用,但是对于原理并没有深刻理解…

树莓派Pico 2,RP2350 现已发售!

https://www.bilibili.com/video/BV1n5YeeMETu/?vd_sourcea637ced2b66f15709d16fcbaceeb47a9 我们很高兴地宣布推出Raspberry Pi Pico 2,我们的第二代微控制器板:采用了由我们自主设计的新款高性能安全型微控制器 RP2350。 Raspberry Pi Pico 2&#…

5 种经过验证的查询翻译技术可提高您的 RAG 性能

如何在用户输入模糊的情况下获得近乎完美的 LLM 性能 欢迎来到雲闪世界。你认为用户会向 LLM 提出完美的问题,这是大错特错。如果我们不直接执行,而是细化用户的问题,结果会怎样?这就是查询转换。 我们开发了一款应用程序&#x…

查看DrawCall流程 Unity工具 Frame Debug

切换帧率 基础面板 可以看到 我们可以通过切换面板 看DrwaCall产生 MainTex 就是材质了 如何优化? 合批 就会一次性直接渲染