Redis 键值对操作详解:Python 实现指南

一、环境准备

1. 安装依赖库

pip install redis

2. 连接 Redis 数据库

import redis# 创建 Redis 客户端连接
r = redis.Redis(host='localhost',  # Redis 服务器地址port=6379,         # Redis 端口db=0,              # 数据库编号(0~15)password=None,     # 密码(若无密码则为 None)decode_responses=True  # 自动解码返回值为字符串
)# 测试连接
try:r.ping()print("成功连接到 Redis 服务器")
except redis.ConnectionError:print("无法连接 Redis 服务器")

二、添加键值对操作

1. 添加单个键值对

# 添加/覆盖键值对
result = r.set("username", "john_doe")
print(f"添加结果: {result}")  # 输出: True# 添加带条件的键值对(仅当键不存在时)
result = r.set("email", "john@example.com", nx=True)
print(f"条件添加结果: {result}")  # 键不存在时返回 True,存在时返回 None

2. 批量添加键值对

# 批量添加多个键值对
data = {"user:1001:name": "Alice","user:1001:age": "28","user:1001:city": "London"
}
result = r.mset(data)
print(f"批量添加结果: {result}")  # 输出: True

3. 添加带过期时间的键值对

# 设置键值对并在60秒后自动过期
result = r.setex("session_token", 60, "a1b2c3d4e5")
print(f"带过期时间的添加结果: {result}")  # 输出: True# 检查剩余生存时间
ttl = r.ttl("session_token")
print(f"剩余生存时间: {ttl}秒")  # 输出: 60

4. 添加大型键值对

# 创建大型数据集
large_data = {f"item_{i}": f"value_{i}" for i in range(10000)}# 添加大型哈希表
result = r.hset("large:hash", mapping=large_data)
print(f"添加大型哈希表结果: {result}")  # 输出: 添加的字段数量

三、删除键值对操作

1. DELETE 命令(同步删除)

# 删除单个键
result = r.delete("username")
print(f"删除单个键结果: {result}")  # 输出: 1 (成功删除)# 删除多个键
keys_to_delete = ["user:1001:name", "user:1001:age", "non_existent_key"]
result = r.delete(*keys_to_delete)
print(f"删除多个键结果: {result}")  # 输出: 2 (实际删除的键数)

2. UNLINK 命令(异步删除)

# 异步删除单个大键
result = r.unlink("large:hash")
print(f"UNLINK 单个键结果: {result}")  # 输出: 1# 异步删除多个键
keys_to_unlink = ["session_token", "temp:data", "cache:item"]
result = r.unlink(*keys_to_unlink)
print(f"UNLINK 多个键结果: {result}")  # 输出: 实际删除的键数

3. DELETE vs UNLINK 对比

特性DELETE 命令UNLINK 命令
执行方式同步删除(阻塞操作)异步删除(非阻塞操作)
适用场景小型键值对大型键值对(哈希、列表等)
性能影响可能阻塞服务器后台执行,不影响主线程
返回值删除的键数量删除的键数量
内存回收立即回收延迟回收
Python方法.delete().unlink()

4. 删除性能对比测试

import time# 创建大型测试数据
large_hash = {f"key_{i}": f"value_{i}" for i in range(50000)}
r.hset("test:large:hash", mapping=large_hash)# 测试 DELETE 性能
start = time.time()
r.delete("test:large:hash")
delete_duration = time.time() - start# 重新创建数据
r.hset("test:large:hash", mapping=large_hash)# 测试 UNLINK 性能
start = time.time()
r.unlink("test:large:hash")
unlink_duration = time.time() - startprint(f"DELETE 耗时: {delete_duration:.4f}秒")
print(f"UNLINK 耗时: {unlink_duration:.4f}秒")
print(f"性能差异: DELETE 比 UNLINK 慢 {delete_duration/unlink_duration:.1f}倍")

四、高级操作技巧

1. 管道操作(批量执行)

# 使用管道批量添加和删除
with r.pipeline() as pipe:# 批量添加pipe.set("counter", 0)pipe.incrby("counter", 100)pipe.set("status", "active")# 批量删除pipe.delete("temp:data1", "temp:data2")pipe.unlink("large:cache")# 执行所有命令results = pipe.execute()print(f"管道操作结果: {results}")

2. 哈希表操作

# 添加哈希表
r.hset("user:1002", mapping={"name": "Bob","email": "bob@example.com","age": "32"
})# 获取哈希表字段
name = r.hget("user:1002", "name")
print(f"用户名: {name}")# 删除哈希表字段
r.hdel("user:1002", "age")# 获取所有字段
all_fields = r.hgetall("user:1002")
print(f"用户数据: {all_fields}")

3. 键存在性检查

# 检查单个键是否存在
exists = r.exists("username")
print(f"键存在: {bool(exists)}")  # 输出: True 或 False# 检查多个键是否存在
count = r.exists("key1", "key2", "key3")
print(f"存在的键数量: {count}")

五、最佳实践与注意事项

1. 键操作选择指南

  • 小型字符串键:DELETE 或 UNLINK 均可
  • 大型数据结构:始终使用 UNLINK
  • 批量删除操作:优先使用 UNLINK + 管道
  • 需要立即释放内存:使用 DELETE
  • 高并发环境:优先使用 UNLINK

2. 内存管理建议

# 监控内存使用情况
info = r.info("memory")
print(f"已用内存: {info['used_memory_human']}")
print(f"待删除对象: {info['lazyfree_pending_objects']}")

3. 错误处理与重试

from redis.exceptions import ConnectionError, TimeoutError
import timedef safe_operation():attempts = 0max_attempts = 3while attempts < max_attempts:try:# 尝试执行操作return r.set("important:data", "critical_value", ex=30)except (ConnectionError, TimeoutError) as e:attempts += 1print(f"操作失败 ({attempts}/{max_attempts}): {str(e)}")time.sleep(2 ** attempts)  # 指数退避print("操作失败,达到最大重试次数")return Falsesafe_operation()

4. 性能优化技巧

  1. 批量操作:使用 MSET 替代多个 SET,使用管道处理批量命令
  2. 键名设计:使用可读的命名空间(如 user:1000:profile
  3. 过期时间:为临时数据设置 TTL,避免手动删除
  4. 异步删除:大型数据删除始终使用 UNLINK
  5. 连接复用:避免频繁创建/关闭连接

六、总结与选择建议

操作选择矩阵

场景推荐操作替代方案
添加小数据SETHSET(对象)
添加大数据HSET/MSET分批次添加
添加临时数据SETEXSET + EXPIRE
删除小数据DELETEUNLINK
删除大数据UNLINK
批量操作管道 + MSET/UNLINK单独命令

核心要点总结

  1. 添加操作

    • 使用 set() 添加单个键值对
    • 使用 mset() 批量添加多个键值对
    • 使用 setex() 添加带过期时间的键值对
  2. 删除操作

    • 优先使用 unlink() 进行删除(尤其大型数据)
    • 仅在需要立即释放内存时使用 delete()
    • 批量删除时结合管道提高效率
  3. 性能关键

    • UNLINK 比 DELETE 快数百倍(大型数据)
    • 管道操作可减少网络往返时间
    • 合理设置过期时间减少手动删除
  4. 最佳实践

    • 生产环境默认使用 UNLINK
    • 监控 lazyfree_pending_objects 指标
    • 使用指数退避策略处理连接错误
# 最终推荐操作模式
def redis_best_practice():# 添加数据r.set("app:status", "running", ex=3600)  # 带过期时间r.mset({"config:theme": "dark", "config:lang": "en"})# 删除数据r.unlink("old:cache:data")  # 大型数据r.unlink("temp:session:1", "temp:session:2")  # 批量删除# 使用管道with r.pipeline() as pipe:pipe.incr("counter:requests")pipe.expire("counter:requests", 86400)pipe.unlink("obsolete:key")pipe.execute()

通过本指南,您应该能够熟练地在 Python 中实现 Redis 的键值对添加和删除操作,理解 DELETE 和 UNLINK 的核心区别,并在不同场景下选择最优的操作策略。

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

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

相关文章

制造业企业大文件传输的痛点有哪些?

在全球化与数字化的浪潮下&#xff0c;制造业企业的大文件传输需求日益凸显&#xff0c;然而诸多痛点也随之而来&#xff0c;严重制约着企业的高效运营与发展。复杂网络环境导致传输稳定性差制造业企业常涉及跨地域、跨国的业务合作与数据交流&#xff0c;网络环境复杂多变。在…

低速信号设计之 MDIO 篇

一、引言​ 在服务器的网络子系统中,MDIO(Management Data Input/Output)总线虽然传输速率相对较低,却扮演着极为关键的角色。它主要负责在 MAC(Media Access Control)层器件与 PHY(Physical Layer)层器件之间搭建起通信的桥梁,实现对 PHY 层器件的有效管理与状态监控…

AR技术赋能航空维修:精度与效率的飞跃

在航空工业领域&#xff0c;飞机维修与装配的精度要求越来越高。传统的维修方法依赖人工操作和经验判断&#xff0c;容易产生误差。随着增强现实&#xff08;AR www.teamhelper.cn &#xff09;技术的引入&#xff0c;航空维修迎来了革命性的变化。本文将探讨AR技术在航空维修中…

设计模式实战:自定义SpringIOC(理论分析)

自定义SpringIOC&#xff08;理论分析&#xff09; 上一篇&#xff1a;设计模式开源实战&#xff1a;观察者模式不知道怎么用&#xff1f;手撕Spring源码中跟着大佬学编程 上一篇我们研究了大佬在Spring源码中使用的观察者模式&#xff0c;今天我们再来聊聊Spring的核心功能—…

人工智能如何改变项目管理:应用、影响与趋势

人工智能如何改变项目管理&#xff1a;应用、影响与趋势1. 人工智能如何提升项目规划与进度安排2. 人工智能在资源分配与优化中的应用3. 人工智能用于风险管理4. 人工智能用于团队协作与交流5. 人工智能用于项目监控与报告6. 集成人工智能的项目管理软件6.1 Wrike6.2 ClickUp6.…

【MySql】事务的原理

​ 【MySql】事务的原理数据库的隔离级别原理读未提交读已提交可重复读&#xff08;Repeatable Read&#xff09;串行化&#xff08;最高的隔离级别&#xff0c;强制事务串行执行&#xff0c;避免了所有并发问题&#xff09;MVCC&#xff08;Multi-Version Concurrency Control…

YOLO--目标检测基础

一、基本认知1.1目标检测的定义目标检测&#xff08;Object Detection&#xff09;&#xff1a;在图像或视频中检测出目标图像的位置&#xff0c;并进行分类和识别的相关任务。主要是解决图像是什么&#xff0c;在哪里的两个具体问题。1.2使用场景目标检测的使用场景众多&#…

GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【四】

沿袭我们的月度发布传统&#xff0c;极狐GitLab 发布了 18.2 版本&#xff0c;该版本带来了议题和任务的自定义工作流状态、新的合并请求主页、新的群组概览合规仪表盘、下载安全报告的 PDF 导出文件、中心化的安全策略管理&#xff08;Beta&#xff09;等几十个重点功能的改进…

Python----大模型(大模型微调--BitFit、Prompt Tuning、P-tuning、Prefix-tuning、LORA)

一、大模型微调 1.1、解释 微调(Fine-tuning)是在预训练大模型基础上&#xff0c;针对特定领域数据进行二次训练的技术过程。这一过程使大型语言模型(如GPT、BERT等)能够更好地适应具体应用场景&#xff0c;显著提升在专业领域的表现。 1.2、微调的基本流程 模型选择&#xf…

本地安装 SQLite 的详细步骤

方法 1:使用预编译二进制文件 下载 SQLite: 访问 SQLite 官方下载页面。 下载 Precompiled Binaries for Windows 中的 sqlite-tools-win32-x86-*.zip。 解压文件: 将下载的 ZIP 文件解压到一个目录(例如 C:\sqlite)。 配置环境变量: 右键「此电脑」→「属性」→ 左侧「高…

专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载

原文链接&#xff1a;https://tecdat.cn/?p43444 圈内人都知道&#xff0c;2024年的BioChina展会现场&#xff0c;某跨国药企高管盯着融资展板喃喃自语&#xff1a;“去年A轮平均3.2亿&#xff0c;今年怎么降到2.1亿了&#xff1f;” 这个细节&#xff0c;恰是行业寒冬的缩影…

Chroma安装教程

Chroma 这里讲述的是windows环境 下载Chroma安装包 下载地址&#xff1a;https://github.com/chroma-core/chroma/releases 运行 chroma-windows.exe run --port 8000通过心跳检测访问是否正常 http://localhost:8000/api/v2/heartbeat快速使用 python安装chromadb pyth…

kali Linux 2025.2安装教程(解决安装失败-图文教程超详细)

一&#xff0c;下载镜像&#xff1a; 进入官网&#xff1a;Get Kali | Kali Linux &#xff0c;往下滑 等待两年半&#xff0c;镜像下载好。 二&#xff0c;虚拟机安装&#xff1a; 转&#xff1a;VMware Workstation Pro 17 安装图文教程 知乎平台&#xff1a;VMware Work…

uniapp项目使用ucharts实现折线图详细讲解(案例)

1.在Hbuildx里面的工具>插件安装&#xff0c;进入DCloud搜索uchart 2.点击对应的项目导入该插件 可以看到在该目录下有该插件 3.进入官网演示 - uCharts跨平台图表库&#xff0c;找一个示例代码测试一下&#xff0c;是否可以成功应用 因为这里使用的是vue2&#xff0c;如果你…

数据分析师进阶——95页零售相关数据分析【附全文阅读】

这份资料适合零售行业从业者&#xff0c;尤其是服装销售领域的人员&#xff0c;能帮大家用数据分析提升销售业绩。资料先提出 “店铺 20 问”&#xff0c;引导思考店铺运营问题&#xff0c;接着点明数据分析对提升销售、找出销售不佳原因的重要性 。详细介绍销售业绩相关公式及…

计算机组成原理(6) - 加法器

加法器是数字电路中用于执行加法运算的基本逻辑单元&#xff0c;广泛应用于计算机、计算器、数字信号处理器等电子设备中。它能将两个二进制数相加&#xff0c;并输出结果及可能产生的进位。一、加法器的基本功能加法器的基本功能是在数字电路中对输入的二进制数执行加法运算&a…

Qt 与 WebService 交互开发

在现代软件开发中&#xff0c;WebService 已成为实现跨平台、跨语言通信的重要标准。Qt 作为一个强大的跨平台框架&#xff0c;提供了完善的工具和类库来实现与 WebService 的交互。本文将深入探讨 Qt 与 WebService 交互开发的核心技术和实践经验&#xff0c;包括 SOAP 协议实…

LLM 模型部署难题的技术突破:从轻量化到分布式推理的全栈解决方案

大语言模型(LLM)的部署一直是工业落地的核心挑战。动辄百亿甚至万亿参数的模型规模,对硬件资源、推理速度和系统稳定性提出了严苛要求。本文将系统剖析 LLM 部署中的关键技术瓶颈,从模型压缩、推理加速到分布式架构设计,提供可落地的工程化解决方案,并附具体实现代码。 …

理解训练深度前馈神经网络的困难—— 解锁深度学习的关键钥匙

2010年&#xff0c;深度学习先驱 Xavier Glorot 和 Yoshua Bengio 发表了这篇里程碑式的论文。它精准地诊断了当时阻碍深度神经网络发展的核心顽疾——**梯度消失/爆炸问题**&#xff0c;并开出了革命性的“药方”&#xff1a;**Xavier/Glorot 初始化**。这篇论文扫清了训练深度…

Objective-c 初阶——异常处理(try-catch)

一、try/catch/throw/finally 执行顺序 void doSomething() {NSAutoreleasePool *pool [[NSAutoreleasePool alloc] init];try {// 这一步抛异常[self riskyMethod]; } catch (NSException *e) {throw; // 把异常继续往上抛} finally {// ❗ 注意&#xff1a;这里的 finally…