1 什么是 Bigkey
字符串类型:一般认为超过 10 KB 就是 Bigkey 非字符串类型:哈希、列表、集合、有序集合,体现在元素个数过多,比如超过 5000 个。
2 Bigkey 的危害
内存空间不均匀:比如在 Redis cluster 或者 codis 中,会造成节点的内存使用不均匀。 阻塞:因为 Redis 单线程特性,如果操作某个 Bigkey 耗时比较久,则后面的请求会被阻塞。 过期时可能阻塞:如果 Bigkey 设置了过期时间,当过期后,这个 key 会被删除,假如没有使用 Redis 4.0 的过期异步删除,就会存在阻塞 Redis 的可能性,并且慢查询中查不到(因为这个删除是内部循环事件)。
3 怎么发现 Bigkey
3.1 自带的 Bigkeys 参数查找
redis-cli -p 6301 --bigkeys

3.2 debug object
debug object key_name


hmset martin age 20 score 90 address shanghai
memory usage martin

3.3 通过 rdbtools 分析 rdb
rdb -c memory dump.rdb >1.csv

3.4 通过脚本扫描
string 类型:通过 strlen 命令判断存储的字符串长度,如果大于 10240,则认为是 Bigkey。 hash 类型:通过 hlen 命令判断域的数量,如果大于 10240,则认为是 Bigkey。 list 类型:通过 llen 命令判断 list 类型 key 的列表长度,如果大于 10240,则认为是 Bigkey。 set 类型:通过 scard 命令判断集合中元素的数量,如果大于 10240,则认为是 Bigkey。 zset 类型:通过 zcard 命令判断有序集合中元素的数量,如果大于 10240,则认为是 Bigkey。
3.5 其他第三方工具
4 优化 Bigkey
4.1 删除 Bigkey
如果 key 类型为 string,则直接删除; 如果 key 类型为 hash、list、set、sorted set,使用 hscan 命令,每次获取部分(例如100个)field-value,再利用 hdel 删除每个 field; Redis 在4.0 版本支持 lazy delete free 的模式,删除 Bigkey 不会阻塞 Redis。
4.2 控制大小
4.3 拆分 Bigkey
对于 string 类型的 Bigkey,可以考虑拆分成多个 key-value。 对于 hash 或者 list 类型,可以考虑拆分成多个 hash 或者 list。
4.4 更换数据库
专栏《Redis 运维实战》系列文章推荐
Redis 运维实战 第01期:Redis 复制
Redis 运维实战 第02期:Redis Cluster
Redis 运维实战 第03期:Codis
Redis 运维实战 第04期:AOF 持久化
Redis 运维实战 第05期:RDB 持久化
最后修改时间:2020-10-22 10:48:18
文章转载自悦专栏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




