什么是 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2018-05-31 自己动手实现XXX系列
2018-05-31 java.lang.ClassFormatError: Extra bytes at the end of class file