Redis篇--常見問題篇4--大Key(Big Key,什么是大Key,影響及使用建議)

1、概述

大Key:通常是指值(Value)的長度非常大,實際上鍵(Key)長度很大也算。通常來說,鍵本身不會很長,占用的內存較少,因此判斷一個鍵是否為bigKey主要看它對應的值的大小。
大Key分為兩種情況:
(1)、鍵(Key)非常大
(2)、值(Value)非常大

2、鍵(Key)非常大

雖然Redis的鍵可以存儲任意字符串(最大限制為512M),但通常情況下,鍵的長度都比較小。

過長的鍵會帶來以下問題:
(1)、內存占用增加:Redis是內存數據庫,鍵的長度直接影響內存使用。如果鍵的長度過大且大量存在時,會顯著增加內存消耗。
(2)、性能下降:Redis的許多操作(如查找、刪除、更新等)都需要對鍵進行哈希計算或字符串比較。如果鍵的長度過長,這些操作的時間復雜度會增加,導致性能下降。
(3)、網絡傳輸開銷:在客戶端與Redis服務器之間傳輸數據時,過長的鍵會增加網絡帶寬的使用,尤其是在分布式系統中,可能會導致網絡延遲。

什么時候算作"大鍵"?
- 一般大鍵:鍵的長度應盡量保持在100字節以內。超過這個長度的鍵可以被視為"大鍵"。
- 極端情況:如果鍵的長度超過幾千字節,則會對Redis的性能產生明顯影響,屬于典型的"大鍵"。

如何避免大鍵?
(1)、使用簡短的鍵名:盡量使用簡短且具有描述性的鍵名。例如,使用user:12345而不是 user_profile_for_user_with_id_12345。
(2)、使用哈希或編碼:對于復雜的鍵名,可以考慮使用哈希函數(如MD5、SHA1)將長字符串轉換為固定長度的哈希值,或者使用Base64編碼來縮短鍵的長度。

3、值(Value)非常大

Redis的值可以是多種類型的數據結構,包括字符串、列表、集合、哈希表、有序集合等。當值的大小非常大時,也會對Redis的性能和內存使用產生負面影響。

過長的值帶來的問題
(1)、內存占用增加:大值會占用更多的內存,尤其是在Redis中存儲大量大值時,可能會迅速耗盡可用內存。
(2)、性能阻塞:某些Redis操作(如GET、SET、DEL等)在處理大值時可能會阻塞Redis服務器,導致其他請求無法及時處理。例如,DEL一個包含數百萬元素的列表或哈希表可能會導致Redis在幾秒鐘內無法響應其他請求。
(3)、網絡傳輸開銷:大值在客戶端與Redis服務器之間傳輸時,會增加網絡帶寬的使用,可能導致網絡延遲或超時。
(4)、備份和持久化壓力:大值會增加Redis的RDB快照和AOF日志的大小,導致備份和持久化操作的時間變長,甚至可能引發磁盤I/O瓶頸。

什么時候算作"大值"?
- 一般建議:對于字符串類型的值,建議單個值的大小不要超過1MB。對于復雜數據結構(如列表、哈希表、集合等),建議每個元素的大小也應盡量控制在合理范圍內。
- 極端情況:如果單個值的大小超過幾十MB或幾百MB,則會對Redis的性能產生顯著影響,屬于典型的"大值"。

如何避免大值?
(1)、分片存儲:對于非常大的值,可以考慮將其拆分成多個小塊進行存儲。例如將一個大列表List拆分成多個較小的列表List存儲。
(2)、使用壓縮:對于文本或二進制數據,可以考慮使用壓縮算法(如Gzip、Snappy)來減少值的大小。
(3)、使用外部存儲:對于不適合存儲在Redis中的大數據,可以考慮將其存儲在其他專門的存儲系統中(如Amazon S3、HDFS),并在Redis中只存儲指向這些數據的引用(如URL或ID)。
(4)、使用流式處理:對于需要頻繁讀取或寫入大值的場景,可以考慮使用Redis的流式處理功能(如XREAD和XADD),每次進讀取部分數據,以避免一次性加載整個大值。

4、其他建議

(1)、優化數據結構:選擇合適的數據結構來存儲數據。例如,使用ZSET(有序集合)而不是HASH(哈希表)來存儲帶有權重的數據,或者使用LIST(列表)而不是SET(集合)來存儲有序的元素。
(2)期清理過期數據:使用Redis的過期機制(EXPIRE、TTL)定期清理不再需要的大鍵或大值,避免長期占用內存。

5、如何檢測大Key

(1)、使用MEMORY USAGE命令
可以使用MEMORY USAGE命令來檢查某個鍵占用的內存大小。
例如:

MEMORY USAGE my_large_key

在這里插入圖片描述
解釋一下:
如上的示例可以看到鍵aaa1使用的內存大小是57字節。
我們從下面一行命令可以看到aaa1的鍵存儲的值是zhangsan1,那么為什么Redis會分配57個字節呢?
答案:
因為Redis會為每一個key和value都創建一個對象頭以記錄key或value的類型,編碼方式等附屬信息;此外Redis的內存分配器jemalloc會分配比實際長度更大的空間保存數據,確保內存對齊和減少磁盤碎片;在加上各種底層數據結構不同也會占用一定的內存空間等,所以實際分配內存會比預想的大一些。
詳細可以參考之前的Redis數據結構架構篇看下。

(2)、使用SCAN命令結合MEMORY USAGE
如果你不確定哪些鍵是大鍵,可以結合SCAN和MEMORY USAGE來批量檢測。例如,編寫一個腳本遍歷所有鍵,并檢查每個鍵的內存占用情況。
scan使用示例:
在這里插入圖片描述

(3)、用Redis自帶的監控工具
Redis提供了INFO memory命令,可以查看當前Redis實例的內存使用情況。你還可以使用Redis的慢查詢日志(SLOWLOG)來檢測哪些命令在處理大鍵時花費了較多時間。
命令示例:
在這里插入圖片描述
說明:
used_memory:Redis分配的總內存量(以字節為單位)。
used_memory_human:used_memory轉可讀方式大小,方便閱讀(如轉KB、MB、GB)

(4)、使用第三方監控工具
一些第三方監控工具(如Redis Desktop Manager、RedisInsight、Prometheus + Grafana)可以幫助你實時監控Redis的內存使用情況,并識別出大鍵。

6、大Key總結

  • 大Key的定義:Redis中的"大 Key"既可以指鍵(Key)非常大,也可以指值(Value)非常大。無論是鍵還是值,過大的大小都會對Redis的性能和內存使用產生負面影響。通常在使用Redis過程中,不會存在過大的key,但是值卻不好說,所以判斷一個鍵是否為bigKey主要還是看它的值的大小。

  • 鍵非常大的影響:鍵過長會增加內存占用、降低性能,并增加網絡傳輸開銷。

  • 值非常大的影響:值過大會占用更多內存,導致阻塞操作、增加網絡傳輸開銷,并給備份和持久化帶來壓力。

  • 如何避免大Key:通過使用簡短的鍵名、分片存儲、壓縮數據、使用外部存儲等方式,可以有效避免大Key對Redis性能的影響。

  • 如何檢測大Key:使用MEMORY USAGE、SCAN、INFO memory等命令或工具來檢測和處理大 Key。

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

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

相關文章

云手機+YouTube:改變通信世界的劃時代技術

隨著科技的不斷進步,手機作為人們生活中不可或缺的工具,也在不斷地更新換代。近年來,一個名為“油管云手機”的全新產品正在引起廣泛的關注和討論。作為一個運用最新科技實現的新型手機,它在通信領域帶來了全新的體驗和革命性的變…

ModbusTCP從站轉Profinet主站案例

一. 案例背景 在復雜的工業自動化場景中,企業常常會采用不同品牌的設備來構建生產系統。西門子SINAMICS G120變頻器以其高性能、高精度的速度和轉矩控制功能,在電機驅動領域應用廣泛。施耐德M580可編程邏輯控制器則以強大的邏輯控制和數據處理能力著稱&…

JS 函數的定義與調用

文章目錄 1. 普通函數-無形參2. 普通函數-有形參3. 普通函數-參數默認值4. 普通函數-返回值5. 立即執行函數6. 匿名函數7. 箭頭函數8. 函數提升 1. 普通函數-無形參 函數定義時沒有指定形參, 調用時仍然可以向其傳遞參數, 通過默認參數 arguments 獲取, arguments 是一個偽數組…

MySQL的索引失效的原因有那些

1. 數據類型不匹配 詳細說明:MySQL在比較不同數據類型的值時,可能會嘗試進行隱式轉換。如果這種轉換導致了復雜度增加或無法直接利用索引,則會導致索引失效。 實例與解決方案: -- 錯誤示例:數據類型不匹配 select *…

邁向未來:.NET技術的持續創新與發展前景

隨著信息技術的飛速發展,編程語言和開發框架不斷涌現,許多技術平臺以其獨特的優勢贏得了開發者的青睞。在這場技術的競爭中,.NET平臺憑借其卓越的性能、廣泛的生態系統以及持續創新的精神,成為了全球開發者的重要選擇。本文將探討…

微信小程序-基于Vant Weapp UI 組件庫的Area 省市區選擇

Area 省市區選擇,省市區選擇組件通常與 彈出層 組件配合使用。 areaList 格式 areaList 為對象結構,包含 province_list、city_list、county_list 三個 key。 每項以地區碼作為 key,省市區名字作為 value。地區碼為 6 位數字,前兩…

Canvas指定三角形內部生成隨機點

使用重心坐標(barycentric coordinates)或者通過面積比例的方法來確定點是否在三角形內。不過,對于簡單的應用,一種常見的方法是使用隨機點并檢查它們是否在三角形內部。如果不在,就重新生成,直到得到足夠數…

智駕感知「大破局」!新一輪混戰開啟

隨著智能駕駛搭載率的攀升,艙外傳感器賽道迎來新變局。 一方面,從近幾年智駕傳感器的配置變化來看,攝像頭的主導地位顯而易見。 12月10-12日,由德賽西威總冠名的2024(第八屆)高工智能汽車年會暨年度金球獎…

深入解析Android Recovery系統

深入解析Android Recovery系統 引言 在Android系統中,Recovery模式是一個非常重要的組成部分。它主要用于系統的恢復、更新和修復。當用戶遇到系統問題時,Recovery模式可以提供一種安全的方式來恢復系統到正常狀態。本文將深入探討Android Recovery系統的實現原理,重點分析…

Kibana8.17.0在mac上的安裝

1、Kibana是什么 Kibana是與elasticsearch配套使用的數據分析與可視化工具,通過Kibana可以輕松與es中存儲的數據進行高效的交互,包括數據寫入、檢索、刪除等操作,并可以通過編寫部分代碼將數據做成各種報表,從而進行非常直觀的統…

數字IC后端設計實現十大精華主題分享

今天小編給大家分享下吾愛IC社區星球上周十大后端精華主題。 Q1:星主,請教個問題,長tree的時候發現這個scan的tree 的skew差不多400p,我高亮了整個tree的schematic,我在想是不是我在這一系列mux前邊打斷,設置ignore p…

給bmp和png,設置BLENDFUNCTION的AlphaFormat不同參數的效果

BLENDFUNCTION是AlphaBlend用控制透明效果的重要參數。 選擇一個32位的png圖片,設置AlphaFormat 為 AC_SRC_ALPHA,效果如上圖。 選擇一個32位的png圖片,設置AlphaFormat 為 0,效果如上圖。 選擇一個24位的bmp圖片,設置…

ChildLife“童年時光杯”足球聯賽啟動 共促青少年健康成長

2024年12月21日至22日,由美國知名嬰幼兒營養品牌ChildLife童年時光贊助的“童年時光杯”青少年足球聯賽將在上海拉開帷幕。本次賽事U7/U8組別共有16支足球隊參賽,包括上海幸運星足球俱樂部旗下的明星球隊,以及其他青少年俱樂部的優秀隊伍&…

面向對象的基本原則【學習、記錄】

1、單一職責原則定義 一個對象應該只包含單一的職責,并且該職責被完整地封裝在一個類中。就一個類而言,應該僅有一個引起它變化的原因。 2、開閉原則定義 一個軟件實體應當對擴展開放,對修改關閉。 3、里氏代換原則定義 如果對每一個類型為S的…

什么是根服務器?有什么作用?

你知道什么是根服務器嗎?在互聯網的龐大架構中,根服務器很多人對它的了解并不深入。那么,根服務器到底是什么,它有什么作用呢? 什么是根服務器? 根服務器是互聯網域名系統(DNS)的一部分,負責管理和維護最頂層的域名信息。簡單…

MTK--mt7921 usb wifi debug

文章目錄 1、代碼編譯2、配置文件修改3、Wifi設置命令4、Wifi debug 淘寶隨便買個7921的usb wifi。 1、代碼編譯 export TEMPLATECONF${PWD}/meta/meta-mediatek-mt8518/conf/base/aud8518sp2-slc-32b-7921-c4a-user source meta/poky/oe-init-build-env bitbake mtk-image-au…

日志層次結構及logger.propagate的作用

一、Python logging 模塊的層次結構 Python 的 logging 模塊提供了一個靈活的日志系統,適用于各種規模的應用程序。其核心設計基于層次化的命名系統,使得日志記錄可以按照組織結構進行管理和配置。 1. Logger(日志器) 定義&…

如何配置OSB連接數據連接/讀取超時

1.Oracle DB OSB中的DBAdapter的查詢超時參數配置沒用,要解決接口超時問題,需要在console中的數據源配置超時參數: oracle.net.CONNECT_TIMEOUT30000 oracle.net.READ_TIMEOUT30000 添加圖片注釋,不超過 140 字(可選…

一起學Git【第六節:查看版本差異】

git diff是 Git 版本控制系統中用于展示差異的強大工具。他可以用于查看文件在工作區、暫存區和版本庫之間的差異、任意兩個指定版本之間的差異和兩個分支之間的差異等,接下來進行詳細的介紹。 1.顯示工作區與暫存區之間的差異 # 顯示工作區和暫存區之間的差異,后面不加參數…

Python數據處理——re庫與pydantic的使用總結與實戰,處理采集到的思科ASA防火墻設備信息

目錄 Python正則表達式re庫的基本用法 引入re庫 各函數功能 總結 使用方法舉例 正則表達式語法與書寫方式 正則表達式的常用操作符 思科ASA防火墻數據 數據1 數據2 書寫正則表達式 Python中pydantic的使用 導入基礎數據模板 根據數據采集目標定義Pydantic數據類型…