什么是大Key/熱Key?
大key和熱key的定義
| 名詞 | 定義 |
|---|---|
| 大key | Redis中存儲的value可以分為兩類,一類是String類型的元素,一類是集合元素,根據這兩類,通過大key可分為以下兩種情況: String類型的value,值超過1 MB。 集合類型的value,成員數超過3000。 |
| 熱key | 熱key通常以其被訪問的請求頻率來判定,當每秒請求數超過3000時,被判定為熱key。 |
存在大Key/熱Key,有什么影響?
| 類別 | 影響 |
|---|---|
| 大key | 客戶端查詢大key時,執行命令的時長變慢。 集群規格實例,存在大key會使得某個分片的內存占用遠超于其他分片,導致內存資源利用不均衡。 若存在對大key的高頻率請求,會導致redis實例出方向帶寬被打滿,導致流控,從而影響本身業務其他使用到redis的業務。 大key占用過高,使得Redis內存使用達到上限,導致重要的Key被逐出,甚至引發內存溢出。 |
| 熱key | 占用cpu資源,影響其他請求,導致整體性能降低。 易造成緩存擊穿,即當熱Key的請求數超出Redis的承受能力時,大量請求將直接訪問后端數據庫,導致數據庫壓力激增甚至宕機,從而影響其他業務。 集群規格實例下,某個分片存在熱key,會導致當前分片的請求壓力增加,易產生單分片性能瓶頸。 |
為了減少大Key和熱Key過大,有什么使用建議?
| 類別 | 建議 |
|---|---|
| 大key | 對于String類型的value,其值大小盡量控制在1MB以內。 集合類型的value,其成員數盡量不超過3000。 使用合適的數據結構,例如對于復雜的數據結構,如果JSON,可以考慮拆分分多個小的key。 對key合理設置過期時間。 |
| 熱key | 客戶端使用本地緩存,對于熱點key,優先從本地獲取,分擔redis的請求壓力。 |
如何分析Redis 3.0實例的熱Key?
由于Redis 3.0本身不提供熱Key能力
| 方法 | 說明 |
|---|---|
| 通過業務層定位熱Key | 通過在業務層增加相應的代碼對Redis的訪問進行記錄并異步匯總分析。 優點:在業務層能夠快速定位熱key。 缺點:需要熟悉了解當前業務系統邏輯。 |
| 通過MONITOR命令 | MONITOR命令用于實時監控客戶端與Redis服務器之間的請求,通過MONITOR命令與重定向符號結合使用,將監視到的命令記錄到日志文件中,通過分析日志文件的請求記錄來找出熱key。 優點:簡單易操作。 缺點:MONITOR命令會持續輸出所有處理的命令,這會對Redis服務器的性能產生影響,生產環境要慎用MONITOR命令。 |
如何提前發現大Key和熱Key?
| 方法 | 說明 |
|---|---|
| 使用Redis自帶的分析工具 | 請參考TOP KEY分析和離線全量KEY分析 |
| 通過redis-cli的bigkeys和hotkeys參數查找大Key和熱Key | 查詢大key: Redis-cli提供了—bigkeys參數,通過遍歷的方式分析實例中的所有Key,并返回Key的整體統計信息與每個數據類型(STRING、LIST、HASH、SET、ZSET、STREAM)中最大的Key,查詢大key的命令示例:redis-cli -h <實例的連接地址> -p <端口> -a <密碼> --bigkeys。 查詢熱key: 自Redis 4.0版本起,redis-cli工具提供了—hotkeys參數,能夠快速定位業務中的熱Key,該命令需要在業務實際運行期間執行,以統計運行期間的熱Key。查詢熱key命令示例:redis-cli -h <實例的連接地址> -p <端口> -a <密碼> --hotkeys。熱Key的詳情可以在輸出結果中的summary部分獲取到。 |
| 通過Redis內置命令對目標Key進行分析 | 對不同數據類型的目標Key,分別通過如下風險較低的命令進行分析,來判斷目標Key是否符合大Key判定標準。STRING類型:執行STRLEN命令,返回對應Key的value的字節數。LIST類型:執行LLEN命令,返回對應Key的列表長度。HASH類型:執行HLEN命令,返回對應Key的成員數量。SET類型:執行SCARD命令,返回對應Key的成員數量。ZSET類型:執行ZCARD命令,返回對應Key的成員數量。STREAM類型:執行XLEN命令,返回對應Key的成員數量。 |
| 通過業務層定位熱Key | 通過在業務層增加相應的代碼對Redis的訪問進行記錄并異步匯總分析。 |
DCS刪除過期Key
過期key的刪除機制在Redis中主要有兩種策略:
1、惰性刪除:在執行讀寫命令前,Redis會檢查key是否過期。若過期,則立即刪除該key,并返回key不存在的結果;若未過期,則繼續執行原命令。
2、定期刪除:Redis通過定時任務實現定期刪除過期key。該任務以一定頻率運行,每次隨機選取一定數量的key進行檢查,并刪除其中的過期key。
這兩種策略結合使用,確保了Redis中過期數據的及時清理,從而優化了緩存性能。
如何查詢過期Key?
通過TTL key_name命令查詢該key_name的過期時間。
如果輸出結果為-1,則表示該key無失效時間,永久保存。
如果輸出結果為-2,則表示該key已經過期或者已經被刪除。
如果輸出結果為>=0的正數,則表示該key的過期時間。
DCS控制臺提供了刪除過期key功能,支持立即刪除和定期刪除,詳情請參考過期key刪除。
Key的保存時間是多久?
如果不對key過期設置過期時間,數據會一直保存。
如果對key設置了過期時間,則數據保存時間為所設置的時間。當key達到過期時間時,該key將不可訪問。
通過ttl命令可以查詢key的過期時間,具體使用命令為:TTL KEY_NAME。
如何設置Key的過期時間?
通過使用expire或pexpire命令可設置key的過期時間,具體命令:expire key_x 100,含義是設置key_x的過期時間為100s。 expire和pexpire的不同之處是:expire是以秒作為key過期時間,而pexpire是以毫秒作為key過期時間。
也可通過SETEX指定key的過期時間,具體執行命令為:SETEX key seconds value。
通過TTL查詢key的過期時間。
Redis執行大Key分析后內存使用率降低的原因
Redis執行大Key分析后內存使用率降低,可能是redis實例中本身存在大量的過期key,由于過期key的惰性刪除機制(對于過期的key,只有被再次訪問時,才會被刪除),導致過期的key的積壓,在進行大key分析,會對redis的實例進行遍歷,當過期的key被遍歷到時會被刪除,因而使得內存使用率降低。