Redis使用中不規範的現象
#Redis 儲存的key命名不規範,比較隨意;
Redis 當成儲存庫使用,有資料遺失風險,且無重新載入方案;
Redis 快取key,未設定過期時間, 快取低頻資料佔用大量內存,進而導致服務崩潰;
Redis 快取大量big key, 應用取得時會佔用大量網路頻寬,刪除也容易造成阻塞;
#Redis 用戶端使用不當,導致其它客戶端連接timeout, 原因可能客戶端密碼錯誤,且沒有使用連接池,大量連接重試導致系統連接埠資源耗光;
- ##Redis 用戶端命令使用不當,導致大量的慢查詢,影響其它應用業務,例如在業務高峰期時使用keys* 或flushall 這樣的命令;
- 高並發場景:熱點資料緩存,可提升系統整體反應速度,降低資料庫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];
- key的長度不超過44位元組;
- ##不要包含特殊字元;
- 關於上面幾個建議,這樣做有以下幾點好處:
- 方便維護管理,不同的應用,或者不同的業務採用不同的前綴,在視覺化客戶端工具或命令列中很方便進行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個;
- #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為物件的序列化字串,資料結構類似下面這樣;
優點:訪問方便,簡單粗暴,訪問時只需要做下json和物件的互轉即可;
缺點:資料耦合,不夠靈活,一旦物件新增了字段或刪減了字段,快取重建的成本非常大;
方案2:使用一個list結構,快取用戶ID列表,資料結構如下;
#優點:對記憶體的佔用小,操作高效;
缺點:取得到val之後,需要進一步查庫才能得到完整的物件;
方案3:使用hash結構,快取對象,資料如下所示;
#優點:底層使用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中文網其他相關文章!

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

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

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

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

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

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

RedisisclassifiedasaNoSQLdatabasebecauseitusesakey-valuedatamodelinsteadofthetraditionalrelationaldatabasemodel.Itoffersspeedandflexibility,makingitidealforreal-timeapplicationsandcaching,butitmaynotbesuitableforscenariosrequiringstrictdataintegrityo

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

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

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript開發工具

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