搜尋
首頁資料庫RedisRedis鍵值設計使用的方法是什麼

    Redis使用中不規範的現象

    • #Redis 儲存的key命名不規範,比較隨意;

    • Redis 當成儲存庫使用,有資料遺失風險,且無重新載入方案;

    • Redis 快取key,未設定過期時間, 快取低頻資料佔用大量內存,進而導致服務崩潰;

    • Redis 快取大量big key, 應用取得時會佔用大量網路頻寬,刪除也容易造成阻塞;

    • #Redis 用戶端使用不當,導致其它客戶端連接timeout, 原因可能客戶端密碼錯誤,且沒有使用連接池,大量連接重試導致系統連接埠資源耗光;

    • ##Redis 用戶端命令使用不當,導致大量的慢查詢,影響其它應用業務,例如在業務高峰期時使用keys* 或flushall 這樣的命令;

    Redis 使用業務場景推薦與建議

    • 高並發場景:熱點資料緩存,可提升系統整體反應速度,降低資料庫IO壓力;

    • ##限時場景:利用Redis expire指令設定session過期與續期、手機驗證碼等;
    • #使用Redis的清單和有序集合資料結構可以實現多種複雜的排行榜應用程式
    • 資料集運算:利用Redis list、set、sorted set,方便進行資料計算, 如交集、並集、差集等;
    • 連續簽到:可以利用redis的bitmap資料結構實現簽到相關的業務;
    • 計數器:利用Redis incr、incrby指令實作api呼叫次數統計,api限流等場景;
    • 分散式鎖定:利用Redis 的setnx 功能來寫分散式的鎖定, 典型開源元件例如redisson;
    • 如何設計出優雅的key

    可以這麼說,線上關於redis的效能優化這個問題上,不合理的key的設計經常是引發問題的根因,究其本質,就個人看到的情況來說,大多數同學在對redis使用過程中,對於key的設計幾乎是沒有什麼概念的,因為大多數同學使用的場景就是key/val ,對應的資料結構就是字符串key/字符串val;

    #稍微對redis有更深入的了解的同學,在進行存儲時,可能會知道key的設計盡量短一點,中間最好有層次感,最好以: 進行分割......

    那麼如何才能設計出比較優雅的key呢?以下結合小編實際使用中的經驗以及踩過的坑,來具體談談;

    一、遵循以下幾個最佳實踐約定

      遵循基本格式:[業務名稱]:[資料名稱]:[id];
    1. key的長度不超過44位元組;
    2. ##不要包含特殊字元;
    3. 關於上面幾個建議,這樣做有以下幾點好處:

    可讀性強,例如當我們設計這樣的key結構, order:user:10,一眼看過去就知道這是關於用戶訂單相關的key;
    • 方便維護管理,不同的應用,或者不同的業務採用不同的前綴,在視覺化客戶端工具或命令列中很方便進行key的查找定位;
    • 避免key衝突,避免在使用過程中多個人都用userId這樣的值作為key引發的快取key衝突;
    • 使用string類型作為key,底層編碼包含int、embstr和raw三種,可以有效降低記憶體佔用。使用embstr可在記憶體佔用較小的情況下,處理小於44位元組的字串,因為它採用了連續記憶體空間
    • ##建議值:

    單一key的value小於10KB;

    • #對於集合型別的key,建議元素數小於1000;

    • #二、盡量避免bigkey

    • 1、什麼是bigkey呢

    BigKey通常以Key的大小和Key中成員的數量來綜合判定,例如:

    Key本身的資料量過大:一個String類型的Key,它的值為5 MB;

    • Key中的成員數過多:一個ZSET類型的Key,它的成員數量為10,000個;

    Key中成員的資料量過大:一個Hash類型的Key,它的成員數量雖然只有1,000個但這些成員的Value(值)總大小為100 MB;

      #2、BigKey的危害
    • 網絡阻塞

    對BigKey執行讀取請求時,少量的QPS就可能導致頻寬使用率被佔滿,導致Redis實例,甚至所在實體機變慢;#### ###########資料傾斜###############BigKey所在的Redis實例記憶體使用率遠超過其他實例,無法讓資料分片的記憶體資源達到均衡;###############Redis阻塞######
    • 對元素較多的hash、list、zset等做運算會耗時較舊,使主執行緒被阻塞;

    CPU壓力

    • 對BigKey的資料序列化和反序列化會導致CPU的使用率飆升,影響Redis實例和本機其它應用;

    3、如何發現BigKey

    在安裝的機器上執行redis-cli --bigkeys指令

    • 利用redis-cli提供的--bigkeys參數,可以遍歷分析所有key,並傳回Key的整體統計資料與每個資料的Top1的big key;

    透過scan掃描

    • 編寫程序,利用scan掃描Redis中的所有key,利用strlen、hlen等指令判斷key的長度(此處不建議使用MEMORY USAGE );

    使用第三方工具

    • #利用第三方工具,如Redis-Rdb-Tools 分析RDB快照文件,全面分析記憶體使用情況;

    使用網路監控

    • #自訂工具,監控進出Redis的網絡數據,超出預警值時主動警告;

    三、使用恰當的數據類型

    正如上面所說,很多初次使用redis的同學,對於很多業務場景,都是一個key/val的簡單的結構搞定,而不會深入思考這樣做是否合理,或者說這樣做以後會不會引發相關的性能方面的問題;

    #對於這個問題,從根本上來說,需要深入了解並掌握redis的常用的資料類型,在這個基礎上,才能針對不同的業務場景,設計出高效的儲存儲存結構資料;

    讓我們思考一下,如何緩存使用者物件列表這樣的資料呢?

    • 方案1:key為usrId,value為物件的序列化字串,資料結構類似下面這樣; 

    Redis鍵值設計使用的方法是什麼

    優點:訪問方便,簡單粗暴,訪問時只需要做下json和物件的互轉即可;

    缺點:資料耦合,不夠靈活,一旦物件新增了字段或刪減了字段,快取重建的成本非常大;

    • 方案2:使用一個list結構,快取用戶ID列表,資料結構如下;

    Redis鍵值設計使用的方法是什麼

    #優點:對記憶體的佔用小,操作高效;

    缺點:取得到val之後,需要進一步查庫才能得到完整的物件;

    方案3:使用hash結構,快取對象,資料如下所示;

    Redis鍵值設計使用的方法是什麼

    #優點:底層使用ziplist,空間佔用小,可以靈活存取對象的任意字段;

    缺點:編碼上相對複雜;

    Redis 快取在實際應用中的使用建議

    • 【建議】對快取進行預熱。在存取數據前,應先對快取進行預熱,避免大量請求直接進入數據儲存層;應根據業務情況劃分合適的冷熱數據,對熱點數據進行預熱。如許可授權訊息,apikey等;

    • 【推薦】 搭配使用本機快取。在分散式架構中,雖然本地快取可以提高資料存取的穩定性和速度,但需要謹慎使用以避免引入具有狀態的伺服器節點。避免本地快取過度佔用應用程式伺服器資源,導致應用程式節點崩潰

    • 【建議】快取變更策略,應先更新資料庫,再更新快取;

    • #【推薦】一次業務呼叫需要存取多次redis服務端,可採用pipleline或其它批次操作方式;

    • 【推薦】大List,Set,Hash,儲存的數量龐大。當獲取大量元素時會產生較大的延遲,從而阻塞其他命令的執行。建議將其拆分成多個小的列表、集合或哈希表

    使用業務規範

    不管是redis,還是其他開發中使用到的中間件,具體到開發使用時,最好都應該提前製定出一套合理的規範,這個規範應該是大多數開發人員認可並在實踐中得到檢驗,且能有效規避一些問題的,一旦指定為規範,應該成為指導內部開發人員日常的規則,這裡提如下幾點:

    • Redis 應該定位為快取數據, 不可用於儲存大規模資料(不可替代資料庫);

    • Redis 適合讀多寫少場景,如存在高頻寫入,低頻查詢場景,則不建議使用;

    • 在不確定key的存活時間時,最好設定過期時間,控制key 的生命週期;

    • 應該考慮冷熱資料分離,對於查詢, 高頻次業務查詢走Redis,低頻查詢考慮走資料庫;

    • 程式處理資料時,應該考慮Redis存在資料遺失的風險,因此需要實現從資料庫自動載入並快取遺失的資料到Redis

    • #謹慎使用O(N)指令, 如list, set, hash 數據結構操作時, hgetall、lrange、smembers、zrange等並非不能使用,優先考慮使用hscan、sscan、zscan 代替。

    #

    以上是Redis鍵值設計使用的方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    REDIS:它如何充當數據存儲和服務REDIS:它如何充當數據存儲和服務Apr 24, 2025 am 12:08 AM

    REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations

    REDIS與其他數據庫:比較分析REDIS與其他數據庫:比較分析Apr 23, 2025 am 12:16 AM

    Redis與其他數據庫相比,具有以下獨特優勢:1)速度極快,讀寫操作通常在微秒級別;2)支持豐富的數據結構和操作;3)靈活的使用場景,如緩存、計數器和發布訂閱。選擇Redis還是其他數據庫需根據具體需求和場景,Redis在高性能、低延遲應用中表現出色。

    REDIS的角色:探索數據存儲和管理功能REDIS的角色:探索數據存儲和管理功能Apr 22, 2025 am 12:10 AM

    Redis在數據存儲和管理中扮演著關鍵角色,通過其多種數據結構和持久化機製成為現代應用的核心。 1)Redis支持字符串、列表、集合、有序集合和哈希表等數據結構,適用於緩存和復雜業務邏輯。 2)通過RDB和AOF兩種持久化方式,Redis確保數據的可靠存儲和快速恢復。

    REDIS:了解NOSQL概念REDIS:了解NOSQL概念Apr 21, 2025 am 12:04 AM

    Redis是一種NoSQL數據庫,適用於大規模數據的高效存儲和訪問。 1.Redis是開源的內存數據結構存儲系統,支持多種數據結構。 2.它提供極快的讀寫速度,適合緩存、會話管理等。 3.Redis支持持久化,通過RDB和AOF方式確保數據安全。 4.使用示例包括基本的鍵值對操作和高級的集合去重功能。 5.常見錯誤包括連接問題、數據類型不匹配和內存溢出,需注意調試。 6.性能優化建議包括選擇合適的數據結構和設置內存淘汰策略。

    REDIS:現實世界的用例和示例REDIS:現實世界的用例和示例Apr 20, 2025 am 12:06 AM

    Redis在現實世界中的應用包括:1.作為緩存系統加速數據庫查詢,2.存儲Web應用的會話數據,3.實現實時排行榜,4.作為消息隊列簡化消息傳遞。 Redis的多功能性和高性能使其在這些場景中大放異彩。

    REDIS:探索其功能和功能REDIS:探索其功能和功能Apr 19, 2025 am 12:04 AM

    Redis脫穎而出是因為其高速、多功能性和豐富的數據結構。 1)Redis支持字符串、列表、集合、散列和有序集合等數據結構。 2)它通過內存存儲數據,支持RDB和AOF持久化。 3)從Redis6.0開始引入多線程處理I/O操作,提升了高並發場景下的性能。

    Redis是SQL還是NOSQL數據庫?答案解釋了Redis是SQL還是NOSQL數據庫?答案解釋了Apr 18, 2025 am 12:11 AM

    RedisisclassifiedasaNoSQLdatabasebecauseitusesakey-valuedatamodelinsteadofthetraditionalrelationaldatabasemodel.Itoffersspeedandflexibility,makingitidealforreal-timeapplicationsandcaching,butitmaynotbesuitableforscenariosrequiringstrictdataintegrityo

    REDIS:提高應用程序性能和可擴展性REDIS:提高應用程序性能和可擴展性Apr 17, 2025 am 12:16 AM

    Redis通過緩存數據、實現分佈式鎖和數據持久化來提升應用性能和可擴展性。 1)緩存數據:使用Redis緩存頻繁訪問的數據,提高數據訪問速度。 2)分佈式鎖:利用Redis實現分佈式鎖,確保在分佈式環境中操作的安全性。 3)數據持久化:通過RDB和AOF機制保證數據安全性,防止數據丟失。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    SublimeText3 英文版

    SublimeText3 英文版

    推薦:為Win版本,支援程式碼提示!

    SublimeText3 Linux新版

    SublimeText3 Linux新版

    SublimeText3 Linux最新版

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript開發工具

    mPDF

    mPDF

    mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),