什么是 BigKey?

Redis BigKey 深度解析:識別、危害與優化方案

什么是 BigKey?

在 Redis 中,BigKey 是指存儲大量數據的單個鍵,這些鍵通常具有異常大的內存占用或包含大量元素。BigKey 不是由數據類型定義,而是由其資源消耗決定的。

BigKey 的判定標準

數據類型BigKey 閾值示例
String值大小 > 10KB大文本/序列化對象
Hash字段數 > 5,000用戶行為記錄表
List元素數 > 10,000系統操作日志隊列
Set元素數 > 10,000用戶標簽集合
ZSet元素數 > 5,000排行榜數據
Stream條目數 > 5,000消息歷史記錄

BigKey 的五大危害

1. 性能瓶頸

圖表

代碼

2. 內存碎片化

BigKey 頻繁修改會導致:

  • 內存分配器頻繁調整

  • 內存碎片率上升

  • 有效內存減少

3. 網絡阻塞

python

# 1MB的String鍵傳輸時間計算
data_size = 1024 * 1024  # 1MB
network_speed = 100 * 1024 * 1024 / 8  # 100Mbps ≈ 12.5MB/s
transfer_time = data_size / network_speed  # ≈ 80ms

80ms內Redis無法處理其他請求!

4. 主從同步問題

  • 主節點生成RDB時間過長

  • 從節點加載BigKey時超時

  • 復制緩沖區溢出

5. 集群遷移失敗

當集群進行數據遷移時:

  • BigKey 遷移超時

  • 遷移任務失敗

  • 槽位分配不一致

檢測 BigKey 的四種方法

1. 官方工具 redis-cli

bash

# 掃描所有鍵并報告大鍵
redis-cli --bigkeys -i 0.1  # 每100ms掃描一次# 輸出示例
[00.00%] Biggest string found so far 'bigstr' with 10240000 bytes
[12.34%] Biggest hash   found so far 'user:1000:data' with 50000 fields

2. MEMORY USAGE 命令

bash

# 精確測量鍵內存使用
> MEMORY USAGE user:1000:profile
(integer) 15728640  # 15MB

3. 開源工具 RDB Tools

bash

# 分析RDB文件
rdb -c memory dump.rdb --bytes 10240 > memory.csv# 輸出CSV格式
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,hash,user:1000:data,10485760,hashtable,50000,1024

4. 自定義掃描腳本

python

import redis
from redis.exceptions import ResponseErrordef scan_bigkeys(host, port, db, threshold):r = redis.Redis(host=host, port=port, db=db)cursor = '0'while cursor != 0:cursor, keys = r.scan(cursor=cursor, count=100)for key in keys:try:key_type = r.type(key).decode()size = 0if key_type == 'string':size = r.memory_usage(key)elif key_type == 'hash':size = r.hlen(key) * 100  # 估算字段平均大小elif key_type == 'list':size = r.llen(key) * 100  # 估算元素平均大小if size > threshold:print(f"BigKey: {key} | Type: {key_type} | Size: {size}")except ResponseError:continue

BigKey 優化策略

1. 數據分片

python

# 原始BigKey
big_key = "user:1000:behavior_log"# 分片方案
for i in range(10):shard_key = f"user:1000:behavior_log:{i}"r.ltrim(shard_key, 0, 999)  # 每個分片最多1000元素

2. 數據壓縮

java

// Java示例:使用GZIP壓縮
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(baos);
gzip.write(largeData.getBytes(StandardCharsets.UTF_8));
gzip.close();
redis.set("compressed:key", baos.toByteArray());

3. 數據結構優化

原結構問題優化方案內存減少
Hash存儲用戶屬性使用Ziplist編碼60-70%
String存儲序列化對象使用MessagePack格式30-50%
Set存儲用戶標簽使用HyperLogLog估算95%

4. 漸進式刪除

bash

# 刪除大Hash
redis-cli --eval del_big_hash.lua big_hash_key , 1000# del_big_hash.lua
local key = KEYS[1]
local batch = tonumber(ARGV[1])
local cursor = 0
repeatlocal result = redis.call('HSCAN', key, cursor, 'COUNT', batch)cursor = tonumber(result[1])local fields = result[2]for i=1, #fields, 2 doredis.call('HDEL', key, fields[i])end
until cursor == 0
redis.call('DEL', key)

BigKey 預防措施

1. 設計規范

  • 鍵命名約定:<type>:<id>:<field>

  • 值大小限制:String ≤ 10KB,集合元素 ≤ 5,000

  • 過期時間:所有鍵必須設置TTL

2. 監控體系

圖表

代碼

監控關鍵指標:

  • redis_memory_used_bytes

  • redis_key_size{type="string"}

  • redis_key_length{type="list"}

3. 自動化檢測

python

# 定時掃描腳本
import schedule
import timedef bigkey_scan_job():# 執行掃描邏輯scan_bigkeys('localhost', 6379, 0, 10*1024)# 每天凌晨2點執行
schedule.every().day.at("02:00").do(bigkey_scan_job)while True:schedule.run_pending()time.sleep(60)

真實案例:電商平臺BigKey優化

問題描述:

  • 用戶購物車鍵:cart:user_12345

  • 數據結構:Hash

  • 問題:單個用戶購物車包含15,000+商品

  • 內存占用:48MB

優化方案:

  1. 分片存儲

    python

    SHARD_COUNT = 10
    user_id = "user_12345"# 添加商品
    shard_index = hash(item_id) % SHARD_COUNT
    key = f"cart:{user_id}:{shard_index}"
    r.hset(key, item_id, quantity)# 獲取全部商品
    cart = {}
    for i in range(SHARD_COUNT):cart.update(r.hgetall(f"cart:{user_id}:{i}"))
  2. 數據歸檔

    • 活躍購物車:Redis存儲最近30天商品

    • 歷史購物車:遷移到MySQL

  3. 結果

    • 最大分片大小:1.2MB

    • 內存減少:96%

    • 操作延遲:從120ms降至8ms

BigKey處理最佳實踐

  1. 避免在事務中操作BigKey

  2. 禁用KEYS命令,使用SCAN代替

  3. 集群模式下分散BigKey到不同節點

  4. 使用Lazy Free特性(Redis 4.0+)

    bash

    # 配置異步刪除
    lazyfree-lazy-eviction yes
    lazyfree-lazy-expire yes
    lazyfree-lazy-server-del yes
  5. 定期執行內存分析

    bash

    redis-cli MEMORY DOCTOR
    redis-cli MEMORY MALLOC-STATS

總結:BigKey處理路線圖

圖表

代碼

關鍵原則

  1. 設計階段預防優于后期修復

  2. 監控持續化,檢測自動化

  3. 刪除操作必須漸進式

  4. 集群環境分散存儲

通過合理的數據建模、嚴格的設計規范和持續的監控優化,可以有效避免BigKey問題,確保Redis高性能穩定運行。

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

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

相關文章

量化選股策略 聚寬

# 量化選股策略完整分析與優化建議 ## 策略整體架構分析 這個量化交易策略主要由以下幾個核心部分組成&#xff1a; 1. **初始化設置**&#xff1a;配置基準指數、交易參數和全局變量 2. **選股邏輯**&#xff1a;通過財務指標篩選優質股票 3. **股票過濾**&#xff1a;排除…

Python 數據分析:numpy,抽提,布爾索引2。

目錄 1 示例代碼2 歡迎糾錯3 論文寫作/Python 學習智能體------以下關于 Markdown 編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右S…

解決leetcode第3597題分割字符串

3597. 分割字符串 難度&#xff1a;中等 問題描述&#xff1a; 給你一個字符串 s&#xff0c;按照以下步驟將其分割為 互不相同的段 &#xff1a; 從下標 0 開始構建一個段。 逐字符擴展當前段&#xff0c;直到該段之前未曾出現過。 只要當前段是唯一的&#xff0c;就將其…

電源芯片之DCDC初探索ING

1. 概述 DC-DC轉換器的意思是直流變直流&#xff08;不同的直流電源值得轉換&#xff09;&#xff0c;是一種在直流電路中將一個電壓值的電能變為另一個電壓值的電能裝置。 DC-DC轉換器一般由控制芯片、電感線圈、二極管、三極管、電容器構成。 2. 基本拓撲結構 2.1 非隔離…

JavaEE:分布式session

一、使用Redis存儲分布式session&#xff1a; 1.SpringBoot整合Redis&#xff0c;見如下地址&#xff1a; JavaEE&#xff1a;SpringBoot整合Redis_a526001650a-CSDN博客 2.代碼實現分布式session存儲(此處以token為例)&#xff1a; Autowired private RedisTemplate<St…

OpenCV CUDA模塊設備層-----“大于閾值設為零” 的圖像處理函數 thresh_to_zero_inv_func()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模塊&#xff08;cudev&#xff09; 中的一個仿函數生成器&#xff0c;用于創建一個 “大于閾值設為零” 的圖像處理函數對象。 …

FastGPT與MCP:解鎖AI新時代的技術密碼

一、AI 浪潮中的新星&#xff1a;FastGPT 與 MCP 登場 在當今科技飛速發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;已成為推動各行業變革的核心力量。從智能語音助手到復雜的圖像識別系統&#xff0c;AI 的應用無處不在&#xff0c;而其中的關鍵技術 —— 語言模…

browser-tools-mcp + excel-mcp-server + cursor 實現讀取網頁信息自動寫入Excel

browser-tools-mcp excel-mcp-server cursor 實現讀取網頁信息自動寫入Excel 文章目錄 browser-tools-mcp excel-mcp-server cursor 實現讀取網頁信息自動寫入Excel一、安裝node.js和npm1、安裝nvm2、安裝最新版本的node.js 二、安裝browser-tools-mcp1、安裝 BrowserTools…

Linux安裝JDK和Maven

Linux安裝JDK和Maven 安裝JDK1.8 oracle官網 https://www.oracle.com 下載包地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 步驟1&#xff1a;官網下載壓縮包 點擊想要下載的版本&#xff0c;需要登錄Oracle的賬號&#xff0c;沒有的話需要…

MySQL主從復制與數據庫集群深度解析

一、主從復制核心架構與復制模式 MySQL主從復制是構建分布式數據庫的基礎技術&#xff0c;通過日志同步機制實現數據冗余與讀寫分離。其核心架構分為三層&#xff1a; 日志記錄層&#xff1a;主庫將數據變更寫入二進制日志&#xff08;Binlog&#xff09;網絡傳輸層&#xff…

安裝emsdk 4.0.10報Connection reset by peer解決

出錯如下: 使用瀏覽器下載所需文件 https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/node-v22.16.0-darwin-x64.tar.gz 移動到到emsdk/downloads下 修改emsdk.py download_even_if_exists=True 設置環境變量

win11,visual studio 2022,配置dcmtk,opencv

一、配置dcmtk 1 文件下載---地址&#xff0c;Software Development based on DCMTK - dicom.offis.de 源文件下載&#xff0c;選擇.zip下載&#xff0c;.tar.gz為Linux和macOS下面常見的壓縮包 支持庫下載 解決 DCMTK 在 Windows 上編譯時所需的依賴庫問題 libiconv GNU有…

2025 最新 Appium Inspector 環境搭建教程

1 環境搭建背景 版本升級&#xff1a;Appium 2.0 版本替代 1.x&#xff0c;原 Appium Desktop 因安全漏洞和功能廢棄不再適用。需求痛點&#xff1a;Android Studio 僅支持 debug 程序元素定位&#xff0c;需通過 Appium Inspector 實現通用 APK 元素定位。 2 環境搭建步驟 …

Vue 安裝使用教程

一、Vue 簡介 Vue&#xff08;讀作 /vju?/&#xff0c;類似于“view”&#xff09;是一款用于構建用戶界面的漸進式 JavaScript 框架。它易于上手&#xff0c;輕量高效&#xff0c;適合快速構建前端界面&#xff0c;廣泛應用于各類 Web 項目中。 二、Vue 安裝方式 2.1 直接通…

通過http調用來訪問neo4j時報錯,curl -X POST 執行指令報錯

curl -X POST ^ More? http://localhost:7474/db/neo4j/tx/commit ^ More? -H Authorization: Basic bmVvNGo6MTIzNDU2Nzg ^ More? -H Content-Type: application/json ^ More? -d { \"statements": [{\"statement": \"MATCH (n) RETURN n, label…

Node.js到底是什么

我想像是npm、vite這些名詞大家都很熟悉&#xff0c;對它們的作用也有大致印象&#xff0c;但是可能都像我一樣不明白Node.js到底是什么&#xff0c;這里給大家帶來一個簡單介紹。 Node.js 詳解&#xff1a;歷史發展、生態構建與底層原理 一、Node.js 的起源與歷史發展 誕生背…

Rust與Go:GAN實戰對決

Rust與Go生成對抗 GAN概念 GAN的全稱是Generative Adversarial Network,中文翻譯為生成對抗網絡。這是一種深度學習模型,由兩部分組成:生成器(Generator)和判別器(Discriminator)。生成器的任務是創建數據,而判別器的任務是區分生成器創建的數據和真實數據。這兩部分…

pyspark driver 上傳pod本地文件到對象存儲

前提: pyspark driver on k8s,環境變量或者spark_home/jars 下有相關對象存儲的包,報錯包問題就這里添加jar即可 from py4j.java_gateway import java_import from pyspark.sql import SparkSession# ----------------------------------------------------------------------…

使用GeoServer發布地圖shapefi(.shp)數據

1.創建新的工作區 2.添加新的數據存儲&#xff0c;選擇Shapefile - ESRI? Shapefiles (*.shp) 如果這個發布頁面退出了 可以這樣找回來 點擊發布返回圖層我們發布的數據在圖層顯示 點擊Layer Preview 預覽 現在前端就可以用 OpenLayers地圖來調用這個服務了

python+uniapp基于微信小程序的PS社區系統

文章目錄 具體實現截圖本項目支持的技術路線源碼獲取詳細視頻演示&#xff1a;文章底部獲取博主聯系方式&#xff01;&#xff01;&#xff01;&#xff01;本系統開發思路進度安排及各階段主要任務java類核心代碼部分展示主要參考文獻&#xff1a;源碼獲取/詳細視頻演示 ##項目…