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
英文地址,請注明出處:http://en.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…