Redis 大 key 問題 & 問題分析 & 解決方案
Redis
什么是 Redis 大 key
- 單個key 存儲的 value 很大
- 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 發布文章使用:只允許注冊用戶才可以訪問!