Redis 大 key 問題 & 問題分析 & 解決方案


Redis 大 key 問題 & 問題分析 & 解決方案

Redis

什么是 Redis 大 key

  1. 單個key 存儲的 value 很大
  2. hash, set,zset,list 結構中存儲過多的元素

可能存在 Redis 大 key 的業務場景

1.配送范圍特別大的門店
2.促銷活動特別多的門店、商家等
3.高頻用戶下的訂單列表
...

Redis 大 key 的危害

OPS 低也會導致內存占用多、流量大; 比如一次取走100K的數據,當OPS為1000時,就會產生100M/s的流量;

如果為 list,hash 等數據結構,大量的 elements 需要多次遍歷,多次系統調用拷貝數據消耗時間;

主動刪除、被動過期刪除、數據遷移等,由於處理這一個KEY時間長,導致服務端發生阻塞;

如何找出 Redis 大 key

jimdb 管理端,拓撲Tab頁,點擊實例可以使用 Redis 大 key 掃描功能,該功能底層使用 scan 掃描所有 key,會影響實例性能, 選擇在業務低峰進行;

redis 可使用 redis-cli 的 “--bigkeys” 選項查找大Key

如何解決 Redis 大 key 問題

對於需要整取 value 的 大 key, 可以嘗試將對象分拆成幾個 key-value, 使用 multiGet 獲取值,這樣分拆的意義在於分拆單次操作的壓力,將操作壓力平攤到多個實例中,降低對單個實例的IO影響;

對於每次需要取部分 value 的 大 key, 同樣可以拆成幾個 key-value,也可以將這些存儲在一個 hash 中,每個 field 代表具體屬性,使用 hget,hmget 來獲取部分 value,使用 hset,hmset 來更新部分屬性;

對於 value 中存儲過多元素的 key, 同樣可以將這部分元素拆分;

以 hash為例,正常的流程是:


hget(hashKey, field);

hset(hashKey, field, value);

現在可以固定一個桶數量,比如 1w,
每次存取的時候,先在本地計算field的hash值,
對 1w取模,確定 field落在哪個 key 上:

newHashKey = hashKey + (hash(field) % 10000);

hset(newHashKey, field, value);

hget(newHashKey, field);

set,zset,list 做法類似

QPS

Queries Per Second /

https://en.wikipedia.org/wiki/Queries_per_second

refs

https://www.jianshu.com/p/c934ddbdd5de

https://juejin.im/post/6844903954988400648

https://www.jianshu.com/p/c286ad666158

https://xhinliang.win/2018/10/30/distributed/big-key-in-redis/



©xgqfrms 2012-2020

www.cnblogs.com 發布文章使用:只允許注冊用戶才可以訪問!



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM