python 與Redis操作整理

以下是使用 Python 操作 Redis 的完整整理,涵蓋基礎操作、高級功能及最佳實踐:


1. 安裝與連接
(1) 安裝庫

pip install redis

(2) 基礎連接

import redis# 創建連接池(推薦復用連接)
pool = redis.ConnectionPool(host='localhost', port=6379, db=0, password='your_password', decode_responses=True  # 自動解碼為字符串
)
client = redis.Redis(connection_pool=pool)# 測試連接
print(client.ping())  # 輸出 True 表示成功

(3) SSL 連接

client = redis.Redis(host='your-host',port=6380,ssl=True,ssl_certfile='/path/to/cert.crt',ssl_keyfile='/path/to/key.key',ssl_ca_certs='/path/to/ca.crt'
)

2. 基本數據類型操作
(1) 字符串(String)

# 設置值(帶過期時間)
client.set('user:1001', 'Alice', ex=3600)  # ex:秒級過期,px:毫秒級# 獲取值
name = client.get('user:1001')  # 返回字符串(若 decode_responses=True)# 自增/自減
client.incr('counter')        # +1
client.incrby('counter', 5)  # +5
client.decr('counter')        # -1

(2) 哈希(Hash)

# 設置字段
client.hset('user:profile:1001', 'name', 'Alice')
client.hmset('user:profile:1001', {'age': 30, 'email': 'alice@example.com'})# 獲取字段
name = client.hget('user:profile:1001', 'name')        # 'Alice'
all_data = client.hgetall('user:profile:1001')        # {'name': 'Alice', 'age': '30'}# 刪除字段
client.hdel('user:profile:1001', 'email')

(3) 列表(List)

# 插入元素
client.lpush('tasks', 'task1')      # 左側插入
client.rpush('tasks', 'task2')      # 右側插入# 獲取元素
task = client.rpop('tasks')         # 右側彈出 'task2'
all_tasks = client.lrange('tasks', 0, -1)  # 獲取全部元素# 截斷列表
client.ltrim('tasks', 0, 2)        # 保留前3個元素

(4) 集合(Set)

# 添加元素
client.sadd('tags', 'python', 'redis')# 集合運算
common_tags = client.sinter('tags1', 'tags2')  # 交集
all_tags = client.sunion('tags1', 'tags2')     # 并集# 隨機彈出元素
random_tag = client.spop('tags')

(5) 有序集合(ZSet)

# 添加元素(帶分數)
client.zadd('rank', {'Alice': 90, 'Bob': 85})# 獲取排名
rank = client.zrevrank('rank', 'Alice')  # 降序排名(0為最高)# 范圍查詢
top3 = client.zrevrange('rank', 0, 2, withscores=True)  # 前3名及分數

3. 高級功能
(1) 管道(Pipeline)

# 批量操作(減少網絡往返)
pipe = client.pipeline()
pipe.set('key1', 'value1')
pipe.incr('counter')
pipe.execute()  # 返回 [True, 6]

(2) 事務(Transaction)

try:pipe = client.pipeline(transaction=True)pipe.multi()  # 開啟事務pipe.set('balance:1001', 100)pipe.decrby('balance:1001', 50)pipe.incrby('balance:1002', 50)pipe.execute()  # 原子性提交
except redis.exceptions.WatchError:print("事務沖突,需重試")

(3) 分布式鎖

def acquire_lock(lock_name, timeout=10):identifier = str(uuid.uuid4())end = time.time() + timeoutwhile time.time() < end:if client.set(lock_name, identifier, nx=True, ex=timeout):return identifiertime.sleep(0.001)return Falsedef release_lock(lock_name, identifier):script = """if redis.call('get', KEYS[1]) == ARGV[1] thenreturn redis.call('del', KEYS[1])elsereturn 0end"""return client.eval(script, 1, lock_name, identifier) == 1

(4) 發布訂閱

# 發布消息
client.publish('news', 'Breaking News!')# 訂閱頻道
pubsub = client.pubsub()
pubsub.subscribe('news')for message in pubsub.listen():if message['type'] == 'message':print(f"收到消息: {message['data']}")

4. 數據序列化與復雜對象存儲
(1) JSON 序列化

import jsonuser = {'id': 1001, 'name': 'Alice'}
client.set('user:1001', json.dumps(user))# 反序列化
data = client.get('user:1001')
if data:user_data = json.loads(data)

(2) 使用 MessagePack(更高效)

pip install msgpack
import msgpackuser_bytes = msgpack.packb(user)
client.set('user:1001', user_bytes)# 反序列化
data = client.get('user:1001')
if data:user_data = msgpack.unpackb(data)

5. 鍵管理與維護
(1) 掃描鍵(避免阻塞)

# 查找所有以 'cache:' 開頭的鍵
for key in client.scan_iter(match='cache:*', count=1000):print(key)

(2) 設置過期時間

client.expire('user:1001', 3600)       # 設置過期時間(秒)
client.pexpire('user:1001', 3600000)   # 毫秒級過期

(3) 批量刪除鍵

# 刪除所有以 'temp:' 開頭的鍵
keys = list(client.scan_iter(match='temp:*'))
if keys:client.delete(*keys)

6. 最佳實踐
(1) 連接池管理
? 使用 ConnectionPool 復用連接,避免頻繁創建/銷毀。

? 配置最大連接數:

pool = redis.ConnectionPool(max_connections=10)

(2) 性能優化
? 使用 pipeline 批量操作減少網絡延遲。

? 避免大 Key(如超過 1MB 的 String 或 Hash),拆分存儲。

(3) 安全建議
? 禁用高危命令(在 Redis 配置中):

rename-command FLUSHDB ""
rename-command KEYS ""

? 使用低權限賬號運行 Redis。

(4) 監控與調試
? 查看慢查詢:

slow_logs = client.slowlog_get()

? 監控內存使用:

info = client.info('memory')
print(info['used_memory_human'])

7. 常用場景代碼示例
(1) 緩存穿透解決方案

def get_user(user_id):key = f'user:{user_id}'data = client.get(key)if data is None:# 查詢數據庫user = db.query_user(user_id)if user:client.set(key, json.dumps(user), ex=300)else:# 緩存空值防止穿透client.set(key, 'NULL', ex=60)elif data == 'NULL':return Noneelse:return json.loads(data)

(2) 排行榜實現

# 更新分數
client.zadd('leaderboard', {'Alice': 100, 'Bob': 90})# 獲取前10名
top10 = client.zrevrange('leaderboard', 0, 9, withscores=True)

總結

操作類型核心方法適用場景
基礎數據操作set/hset/lpush/sadd/zadd緩存、隊列、標簽、排行榜
事務與管道pipeline + multi批量操作、原子性執行
分布式鎖SET + NX + Lua 腳本資源競爭控制
發布訂閱publish + subscribe實時消息通知
性能優化連接池、Pipeline、異步刪除高并發、大數據量場景

通過合理選擇數據結構和操作方式,Redis 能高效支撐緩存、隊列、計數器、實時分析等多樣化需求。建議結合業務場景靈活應用,并通過監控工具持續優化性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80561.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80561.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80561.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么時候使用Python 虛擬環境(venv)而不用conda

是的&#xff01;python3.9 -m venv rtdetr_env 是 Python 原生的虛擬環境&#xff08;venv&#xff09;&#xff0c;而 conda 是另一個流行的虛擬環境管理工具&#xff08;來自 Anaconda/Miniconda&#xff09;。下面我會詳細對比兩者的區別&#xff0c;并講解 venv 的基本用法…

ubuntu20.04安裝x11vnc遠程桌面

x11vnc是一個VNC服務器, 安裝后我們可以不依賴外部的顯示設備, 通過網絡遠程登錄ubuntu桌面。 安裝x11vnc sudo apt-get install x11vnc 設置VNC登錄密碼 sudo x11vnc -storepasswd /etc/x11vnc.pwd 設置x11vnc在開機時自動啟動 新建如下文件: sudo vi /lib/systemd/sys…

Maven的概念與初識Maven

目錄 一、Maven的概念 1. 什么是Maven 2. 項目構建&#xff1a;從代碼到部署的標準化流程 2.1 Maven構建生命周期 2.2 傳統構建 vs Maven構建 3. 依賴管理&#xff1a;解決“JAR地獄”的利器 3.1 依賴聲明 3.2 依賴傳遞與沖突解決 4. Maven倉庫&#xff1a;依賴的存儲…

Unity-Shader詳解-其二

前向渲染和延遲渲染 前向渲染和延遲渲染總的來說是我們的兩種主要的渲染方式。 我們在Unity的Project Settings中的Graphic界面能夠找到渲染隊列的設定&#xff1a; 我們也可以在Main Camera這里進行設置&#xff1a; 那這里我們首先介紹一下兩種渲染&#xff08;Forward R…

C++ 中 std::tuple 使用詳解

C 中 std::tuple 使用詳解 基本概念 std::tuple 是 C11 引入的模板類&#xff0c;用于打包任意數量、任意類型的值在一起。可看作是類型安全的變長結構體。 #include <tuple>std::tuple<int, std::string, double> t(42, "hello", 3.14);創建 tuple 的…

WebRTC基于網頁的視頻會議,手寫WebRTC流程(html)

WebRTC是web real-time communication網頁及時通信的縮寫&#xff0c;通過javascript就可以實現網頁會話&#xff0c;基于瀏覽器開發出來多媒體應用&#xff0c; 以下是手寫的WEBRTC調用本地攝像頭的html代碼&#xff0c;直接用瀏覽器打開&#xff0c;就可以使用 <!DOCTYPE…

MyBatis 官方子項目詳細說明及表格總結

MyBatis 官方子項目詳細說明及表格總結 1. 核心子項目說明 1.1 mybatis-3 GitHub 鏈接&#xff1a;https://github.com/mybatis/mybatis-3功能&#xff1a; MyBatis 核心框架的源碼&#xff0c;提供 SQL 映射、動態 SQL、緩存、事務管理等核心功能。主要功能&#xff1a; 支持…

【虛幻C++筆記】碰撞檢測

目錄 碰撞檢測參數詳情示例用法 碰撞檢測 顯示名稱中文名稱CSphere Trace By Channel按通道進行球體追蹤UKismetSystemLibrary::SphereTraceSingleSphere Trace By Profile按描述文件進行球體追蹤UKismetSystemLibrary::SphereTraceSingleByProfileSphere Trace For Objects針…

推論階梯——AI與思維模型【81】

一、定義 推論階梯思維模型是一種用于分析和理解人們如何從觀察到的事實,經過一系列的假設、推理和判斷,最終得出結論的思維過程的理論框架。它將這個過程比喻為一個階梯,每一步都建立在前一步的基礎上,逐漸形成一個完整的推論。這個模型幫助我們意識到在思考和決策過程中…

小剛說C語言刷題——1109加密四位數

1.題目描述 某軍事單位用 4位整數來傳遞信息&#xff0c;傳遞之前要求先對這個 4 位數進行加密。加密的方式是每一位都先加上 5然后對 10取余數&#xff0c;再將得到的新數顛倒過來。 例如&#xff1a;原數是 1379 &#xff0c;那么每位加 55對 10 取余數的結果為 6824 &…

云服務器和獨立服務器的區別在哪

在當今數字化的時代&#xff0c;服務器成為了支撐各種業務和應用的重要基石。而在服務器的領域中&#xff0c;云服務器和獨立服務器是兩個備受關注的選項。那么&#xff0c;它們到底有何區別呢&#xff1f; 首先&#xff0c;讓我們來聊聊成本。云服務器通常采用按需付費的模式…

【前端】【業務場景】【面試】在前端開發中,如何優化 SVG(可縮放矢量圖形)的性能,特別是在處理復雜圖形和動畫時

SVG?性能優化&#xff1a;循序漸進 4?步法 目標&#xff1a;先減負 → 再復用 → 后加速 → 最后按場景微調 ①?精簡—把包袱先丟掉 刪除無用元素 隱藏/被遮擋的 <path>、未引用的 <defs> 里漸變、濾鏡。 合并路徑 同填充色或描邊的路徑 ? SVGO / SVGOMG「Mer…

MySQL長事務的隱患:深入剖析與解決方案

MySQL長事務的隱患&#xff1a;深入剖析與解決方案 一、什么是長事務&#xff1f; 在數據庫系統中&#xff0c;長事務(Long Transaction)通常指執行時間超過預期或系統設定閾值的事務。對于MySQL而言&#xff0c;雖然沒有嚴格的時間定義&#xff0c;但一般認為執行時間超過數…

華為AR1200 telnet設置

華為路由配置TELNET登 &#x1f4fa; 啟動TELNET服務 在華為路由器上啟動TELNET服務&#xff0c;執行以下命令&#xff1a; telnet server enable &#x1f511; 配置AAA認證 進入AAA認證配置&#xff0c;創建一個路由器登錄帳號admin123&#xff0c;并設置密碼為huawei123&…

【Token系列】01 | Token不是詞:GPT如何切分語言的最小單元

文章目錄 01 | Token不是詞&#xff1a;GPT如何切分語言的最小單元&#xff1f;一、什么是 Token&#xff1f;二、Token 是怎么來的&#xff1f;——BPE算法原理BPE核心步驟&#xff1a; 三、為什么不直接用詞或字符&#xff1f;四、Token切分的實際影響五、中文Token的特殊性六…

如何快速高效學習Python?

如何快速高效學習Python&#xff1f; How to Fastly and Effectively Learn Python Programming? By JacksonML 1. Python年輕嗎&#xff1f; Python自1991年誕生到現在&#xff0c;已經經歷了三十四年或者更長時間了。畢竟&#xff0c;Python之父 – 吉多范羅蘇姆先生(Gu…

NAT穿透

NAT是 Net Address Traslation的縮寫&#xff0c;即網絡地址轉換 NAT部署在網絡出口的位置。位于內網和公網之間&#xff0c;是連接內挖個主機和公網的橋梁&#xff0c;雙向流量都必須經過NAT&#xff0c;裝有NAT軟件的路由器叫NAT路由器&#xff0c;NAT路由器擁有公網Ip NAT解…

搜索引擎的高級語法

文章目錄 精確搜索&#xff1a;雙引號站內搜索&#xff1a;site通配符搜索&#xff1a;*減號縮小范圍&#xff1a;-文檔搜索&#xff1a;filetypeURL搜索&#xff1a; inurl標題搜索&#xff1a;intitle正文搜索&#xff1a;intext參考鏈接 精確搜索&#xff1a;雙引號 “ ” …

RAG vs 微調:大模型知識更新的最優解之爭

一、技術本質&#xff1a;知識注入的兩條路徑 在大模型應用落地的實踐中&#xff0c;RAG&#xff08;檢索增強生成&#xff09;與微調&#xff08;Fine-tuning&#xff09;已成為知識更新的兩大核心技術路徑。二者的本質差異在于是否對模型參數進行修改&#xff1a; 維度RAG微…

解釋器體系結構風格-筆記

解釋器&#xff08;Interpreter&#xff09;是一種軟件設計模式或體系結構風格&#xff0c;主要用于為語言&#xff08;或表達式&#xff09;定義其語法、語義&#xff0c;并通過解釋器來解析和執行語言中的表達式。解釋器體系結構風格廣泛應用于編程語言、腳本語言、規則引擎、…