Redis 集群批量刪除key報錯 CROSSSLOT Keys in request don‘t hash to the same slot

Redis 集群報錯 CROSSSLOT Keys in request don't hash to the same slot 的原因及解決方案

1. 錯誤原因

在 Redis 集群模式下,數據根據 哈希槽(Slot) 分散存儲在不同的節點上(默認 16384 個槽)。當執行涉及多個 key 的命令(如 DEL key1 key2MGETMSET 等)時,這些 key 必須屬于同一個哈希槽,否則會觸發此錯誤。

示例場景

# 錯誤:key1 和 key2 屬于不同槽
127.0.0.1:6379> DEL key1 key2
(error) CROSSSLOT Keys in request don't hash to the same slot

2. 根本原因
  • Redis 集群要求跨 key 操作的原子性,而不同槽的 key 可能位于不同節點,無法保證原子性。
  • 影響命令:DELMGETMSETSUNION 等多 key 操作。

3. 解決方案
方案 1:強制所有 key 使用相同哈希槽(推薦)

通過 哈希標簽(Hash Tag) 強制讓多個 key 分配到同一個槽。
方法:用 {} 包裹 key 的相同部分,Redis 僅根據 {} 內的內容計算槽。

示例

# 正確:key1 和 key2 使用相同的哈希標簽
127.0.0.1:6379> DEL user:{100}:name user:{100}:age
(integer) 2  # 成功刪除
方案 2:單 key 操作替代多 key 操作

將批量操作拆分為單個命令:

# 原始錯誤命令
DEL key1 key2# 改為單 key 操作
DEL key1
DEL key2
方案 3:使用 -c 參數讓 redis-cli 自動重定向

redis-cli 中啟用集群模式(-c),自動重定向到正確節點:

redis-cli -c -h <host> -p <port> DEL key1 key2

但此方法仍可能因跨槽失敗,僅適用于 key 巧合在同一節點的情況。

方案 4:Lua 腳本保證原子性

Lua 腳本在集群中會被整體發送到同一個節點執行:

-- delete_keys.lua
redis.call('DEL', KEYS[1])
redis.call('DEL', KEYS[2])

執行:

redis-cli -h <host> -p <port> --eval delete_keys.lua key1 key2
方案 5:遍歷所有節點刪除(適用于模糊匹配)

若需刪除通配符匹配的 key(如 index_kline*),需遍歷所有節點:

# 獲取集群所有主節點
NODES=$(redis-cli -h <host> -p <port> cluster nodes | grep master | awk '{print $2}' | cut -d '@' -f1)# 逐個節點執行 SCAN + DEL
for node in $NODES; doredis-cli -h ${node%:*} -p ${node#*:} --scan --pattern "index_kline*" | xargs -n 100 redis-cli -h ${node%:*} -p ${node#*:} DEL
done

4. 如何避免此問題?
  1. 設計 key 時使用哈希標簽
    例如 order:{123}:itemsorder:{123}:status 保證相同訂單的 key 在同一個槽。
  2. 避免跨槽的多 key 操作
    優先使用單 key 命令或事務(MULTI/EXEC)。
  3. 查詢 key 的槽分布
    redis-cli -h <host> -p <port> CLUSTER KEYSLOT "your_key"
    

5. 總結
場景解決方案
批量刪除固定 key使用哈希標簽({}
模糊刪除通配符 key遍歷所有節點 + SCAN
需要原子性操作Lua 腳本
臨時修復單 key 操作或 -c 模式

關鍵點:Redis 集群的多 key 操作必須滿足 同槽規則,設計 key 時提前規劃哈希標簽可徹底避免此問題。

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

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

相關文章

.Net Framework 4/C# LINQ*

一、什么是 LINQ LINQ 是一種在 C# 等編程語言中集成的查詢功能&#xff0c;它允許開發者使用編程語言本身的語法進行數據查詢&#xff0c;而不是嵌入式的字符串 SQL 語句。LINQ 查詢可以應用于對象、XML 和數據庫等多種數據源。 二、LINQ 查詢的基本構成 LINQ 查詢通常包含以…

【docker】容器技術如何改變軟件開發與部署格局

在當今數字化時代&#xff0c;軟件開發與部署的效率和靈活性至關重要。就像古人云&#xff1a;“工欲善其事&#xff0c;必先利其器。”Docker 作為一款強大的容器技術&#xff0c;正如同軟件開發領域的一把利器&#xff0c;極大地改變了應用的開發、交付和運行方式。本文將深入…

MySQL的優化部分介紹

1、定期維護表&#xff1a; ANALYZE TABLE t_order_package; OPTIMIZE TABLE t_order_package; -- 每月在低峰期執行 2、數據歸檔&#xff08;如果create_time較舊&#xff09;&#xff1a; -- 歸檔舊數據到歷史表 INSERT INTO t_order_package_archive SELECT * FROM t_or…

Go基本語法——go語言中的四種變量定義方法

前言 在go語言中&#xff0c;定義一個變量有四種方式&#xff0c;本文單從語法的層面來介紹這幾種方式 單變量定義方法 1.var 變量名 類型&#xff0c;不進行初始化 例如&#xff0c;定義一個變量a后為其賦值&#xff0c;并且打印其值&#xff0c;運行結果如下 //1.不進行…

C++ 對 C 的兼容性

C 對 C 語言的兼容性是有限且有條件的&#xff0c;并非完全無縫兼容。這種兼容性主要體現在語法、標準庫和運行時特性上&#xff0c;但存在一些關鍵差異和不兼容點。以下是詳細分析&#xff1a; 一、C 對 C 的兼容性表現 1. 語法兼容&#xff1a;大部分 C 代碼可直接編譯 基…

ES6 核心語法手冊

ES6 核心語法手冊 一、變量聲明 關鍵字作用域是否可重定義是否可修改特性let塊級作用域??替代 var 的首選const塊級作用域??聲明常量&#xff08;對象屬性可修改&#xff09; // 示例 let name "Alice"; name "Bob"; // ?const PI 3.14; // PI …

react菜單,動態綁定點擊事件,菜單分離出去單獨的js文件,Ant框架

1、菜單文件treeTop.js // 頂部菜單 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定義菜單項數據 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 權限管理,key: 2,icon:…

gRPC協議

目錄 1. gRPC協議介紹及構成 協議分層 協議關鍵字段 2. 示例&#xff1a;Greeter 服務 步驟1&#xff1a;定義 .proto 文件 步驟2&#xff1a;生成代碼 3. Java代碼示例 依賴配置&#xff08;Maven pom.xml&#xff09; 服務端實現 客戶端實現 運行流程 關鍵機制 …

深度學習 w b

在深度學習中&#xff0c;權重 w 和 偏置 b 是神經網絡的核心參數&#xff0c;它們的形態&#xff08;shape&#xff09;取決于網絡結構和數據維度。以下是關于 w 和 b 的詳細解析&#xff1a; 1. 數學表示與物理意義 權重 w&#xff1a; 連接神經元之間的強度&#xff0c;決定…

el-table 樹形數據,子行數據可以異步加載

1、 <el-tableborder:header-cell-style"tableStyle?.headerCellStyle"ref"tableRef":data"tableData"row-key"id":default-expand-all"false" // 默認不展開所有樹形節點:tree-props"{ children: children, hasC…

Vue中渲染函數的使用

Vue中渲染函數的使用 1. render函數2. h()的使用3. render函數和h函數的區分 vue中的渲染函數&#xff1a; 1.template2.render函數3.jsx -> js extension(jsx也是編譯成render函數&#xff0c;可編程能力更強) 1. render函數 1.1. 認識h函數 1.1.1. Vue推薦在絕大多數情況…

【氮化鎵】GaN HMETs器件物理失效分析進展

2021 年 5 月,南京大學的蔡曉龍等人在《Journal of Semiconductors》期刊發表了題為《Recent progress of physical failure analysis of GaN HEMTs》的文章,基于多種物理表征技術及大量研究成果,對 GaN HEMTs 的常見失效機制進行了系統分析。文中先介紹失效分析流程,包括使…

每日Prompt:治愈動漫插畫

提示詞 現代都市治愈動漫插畫風格&#xff0c;現代女子&#xff0c;漂亮&#xff0c;長直發&#xff0c;20歲&#xff0c;豆沙唇&#xff0c;白皙&#xff0c;氣質&#xff0c;清純現代都市背景下&#xff0c;夕陽西下&#xff0c;一位穿著白色露臍短袖&#xff0c;粉色工裝褲…

2025年牛客網秋招/社招高質量 Java 面試八股文整理

Java 面試 不論是校招還是社招都避免不了各種面試。筆試&#xff0c;如何去準備這些東西就顯得格外重要。不論是筆試還是面試都是有章可循的。關鍵在于理解企業的需求&#xff0c;明確自己的定位&#xff0c;以及掌握一定的應試技巧。 筆試部分&#xff0c;通常是對基礎知識、…

在UI界面內修改了對象名,在#include “ui_mainwindow.h“沒更新

?原因?&#xff1a;未重新編譯UI文件?? Qt的UI文件&#xff08;.ui&#xff09;需要通過??uic工具&#xff08;Qt的UI編譯器&#xff09;??生成對應的ui_*.h頭文件。如果你在Qt Designer中修改了對象名&#xff0c;但沒有??重新構建&#xff08;Rebuild&#xff09;…

前端獲取接口數據流程

一、Free-Table組件分析 <free-table v-show"showTable" v-model:page"params.pageNum" 雙向綁定當前頁大小&#xff0c;支持動態更新 v-model:limit"params.pageSize" 雙向綁定每頁大小&#xff0c;支持動態更新 v-loading&…

Linux系統防火墻之iptables

防火墻在一個系統中就好像是一個國家的軍隊&#xff0c;所謂國無軍不安&#xff0c;在系統中也是這樣&#xff0c;防火墻可以保護系統被別人攻擊&#xff0c;過濾垃圾流量等&#xff0c;那么今天我們就來了解一下Linux系統中的一種防火墻iptables。 目錄 iptables概述 規則 …

vue項目使用svg圖標

下面是在 Vue 3 項目中完整引入和使用 vite-plugin-svg-icons 的步驟 1、安裝插件 npm install vite-plugin-svg-icons -D # 或 yarn add vite-plugin-svg-icons -D # 或 pnpm add vite-plugin-svg-icons -D 2、配置 Vite 在 vite.config.ts 或 vite.config.js 中配置&…

元器件基礎學習筆記——結型場效應晶體管 (JFET)

場效應晶體管&#xff08;Field Effect Transistor&#xff0c;FET&#xff09;簡稱場效應管&#xff0c;是一種三端子半導體器件&#xff0c;它根據施加到其其中一個端子的電場來控制電流的流動。與雙極結型晶體管 &#xff08;BJT&#xff09; 不同&#xff0c;場效應晶體管 …

拆解實戰案例:電商ERP管理系統從需求到原型全流程設計

ERP即企業資源計劃系統&#xff0c;全稱為Enterprise Resource Planning&#xff0c;其核心在于運用系統化管理思想&#xff0c;為企業員工及管理層構建一個提供決策支持的管理系統平臺。它匯聚貫通企業各個業務模塊產生的數據流&#xff0c;實現資源配置與業務流程高效協同。尤…