Redis批量操作的實(shí)現(xiàn)示例
一、原生批量命令(MSET)
適用場(chǎng)景:所有鍵的過(guò)期時(shí)間相同或無(wú)過(guò)期設(shè)置,且無(wú)需條件判斷。 方法: 將多個(gè)SET命令合并為MSET命令,但需要注意MSET的局限性(無(wú)法設(shè)置過(guò)期時(shí)間,且所有鍵值對(duì)必須一次性設(shè)置)。
MSET CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858 1 CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201182841857 1 ...(其他鍵值對(duì))
優(yōu)點(diǎn):網(wǎng)絡(luò)開(kāi)銷(xiāo)最小,一次請(qǐng)求完成所有操作。
缺點(diǎn):無(wú)法設(shè)置過(guò)期時(shí)間,且要求所有鍵在同一哈希槽(集群模式下需使用哈希標(biāo)簽{})。
二、Pipeline(管道)
適用場(chǎng)景:需高效批量執(zhí)行命令且允許非原子性操作。
1. 命令行操作
將命令寫(xiě)入文件后通過(guò)管道執(zhí)行:
# 創(chuàng)建命令文件 commands.txt echo "SET CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858 1" >> commands.txt # 追加其他命令... # 通過(guò)redis-cli執(zhí)行 cat commands.txt | redis-cli -h <host> -p <port> -a <password> --pipe
優(yōu)點(diǎn):減少網(wǎng)絡(luò)往返次數(shù),適合大規(guī)模批量操作。
2. 編程語(yǔ)言實(shí)現(xiàn)(以Python為例)
import redis
r = redis.Redis(host='localhost', port=6379)
pipe = r.pipeline()
keys = [
"CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858",
"CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201182841857",
# ...其他鍵
]
for key in keys:
pipe.set(key, 1)
pipe.execute()優(yōu)點(diǎn):代碼靈活,支持?jǐn)U展(如設(shè)置過(guò)期時(shí)間)
三、Lua腳本
適用場(chǎng)景:需原子性執(zhí)行所有命令。
local keys = {
'CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858',
'CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201182841857',
-- 其他鍵
}
for _, key in ipairs(keys) do
redis.call('SET', key, 1)
end執(zhí)行命令:
redis-cli -h <host> -p <port> -a <password> EVAL "$(cat script.lua)" 0
優(yōu)點(diǎn):保證原子性,適合對(duì)一致性要求高的場(chǎng)景。
四、Redis事務(wù)(MULTI/EXEC)
適用場(chǎng)景:需保證命令按順序執(zhí)行,但非嚴(yán)格原子性(集群模式下需所有鍵在同一哈希槽)。
MULTI SET CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201183046858 1 SET CUSTOMER_STAR:STAFF_20220311161756037_CUS_20240201182841857 1 ... EXEC
優(yōu)點(diǎn):命令順序執(zhí)行,支持條件判斷(如WATCH)
缺點(diǎn):集群模式下需使用哈希標(biāo)簽確保鍵在同一節(jié)點(diǎn)
五、Redis集群模式優(yōu)化
問(wèn)題:若為集群環(huán)境,需確保所有鍵在同一哈希槽。 解決方案:
- 使用哈希標(biāo)簽:在鍵名中使用
{}包裹相同部分,例如:SET CUSTOMER_STAR:{STAFF_20220311161756037}_CUS_20240201183046858 1所有鍵的哈希標(biāo)簽
{STAFF_20220311161756037}將分配到同一槽 - 分節(jié)點(diǎn)執(zhí)行:若無(wú)法使用哈希標(biāo)簽,需將命令按哈希槽分組后分別發(fā)送到對(duì)應(yīng)節(jié)點(diǎn)。
六、性能優(yōu)化建議
- 控制批量大小:?jiǎn)未蜳ipeline建議不超過(guò)500條命令,避免內(nèi)存或網(wǎng)絡(luò)阻塞 。
- 錯(cuò)誤處理:Pipeline和Lua腳本需捕獲并處理部分失敗的情況 。
- 網(wǎng)絡(luò)優(yōu)化:優(yōu)先使用內(nèi)網(wǎng)連接,減少延遲 。
七、執(zhí)行方式對(duì)比
| 方法 | 原子性 | 網(wǎng)絡(luò)開(kāi)銷(xiāo) | 適用場(chǎng)景 | 集群兼容性 |
|---|---|---|---|---|
| MSET | 是 | 最低 | 簡(jiǎn)單鍵值批量設(shè)置 | 需哈希標(biāo)簽 |
| Pipeline | 否 | 低 | 高效非原子批量操作 | 需哈希標(biāo)簽或分片 |
| Lua腳本 | 是 | 中 | 復(fù)雜邏輯或原子性要求高 | 需哈希標(biāo)簽 |
| 事務(wù) | 否 | 中 | 順序執(zhí)行且需條件判斷 | 需哈希標(biāo)簽 |
選擇建議:若無(wú)原子性要求,優(yōu)先使用Pipeline;若需原子性且邏輯簡(jiǎn)單,使用Lua腳本。
到此這篇關(guān)于Redis批量操作的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Redis批量操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過(guò)實(shí)例解析布隆過(guò)濾器工作原理及實(shí)例
這篇文章主要介紹了通過(guò)實(shí)例解析布隆過(guò)濾器工作原理及實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
深度剖析Redis雙寫(xiě)一致性問(wèn)題的解決方案
在高并發(fā)場(chǎng)景下,緩存與數(shù)據(jù)庫(kù)的雙寫(xiě)一致性是每個(gè)開(kāi)發(fā)者必須直面的核心挑戰(zhàn),本文通過(guò)5大解決方案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-09-09
Redis底層數(shù)據(jù)結(jié)構(gòu)之字典(Dict)的實(shí)現(xiàn)
本文主要介紹了Redis底層數(shù)據(jù)結(jié)構(gòu)之字典(Dict)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-06-06
php結(jié)合redis實(shí)現(xiàn)高并發(fā)下的搶購(gòu)、秒殺功能的實(shí)例
下面小編就為大家?guī)?lái)一篇php結(jié)合redis實(shí)現(xiàn)高并發(fā)下的搶購(gòu)、秒殺功能的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12

