Redis BigKey问题

90 阅读1分钟

怎么样算BigKey

  • string类型超过10KB
  • list,hash,set,zset个数超过5000就是bigkey

哪些危害

  • 内存不均,集群迁徙困难
  • 超时删除,大key删除缓慢
  • 网络流量阻塞

如何产生

  • 社交类:某用户的粉丝列表,典型案例,粉丝逐步递增
  • 汇总统计:某个报表,月日年长时间累计,导致数据量巨大

如何发现

  • redis-cli --bigkeys

    • 优点:给出每种数据结构Top 1 bigkey,同时给出每种数据类型的键值个数+平均大小
    • 不足:想查询大于10kb的所有key,--bigkeys参数就无能为力了,需要用到memory usage来计算每个键值的字节数
  • MEMORY USAGE [key] 计算每个键值的字节数 memory-usage.jpg

如何删除

string

  • 方法:一般用del,如果过于庞大unlink

list

  • 方法:使用ltrim渐进式逐步删除,直到全部删除完成
  • 命令

ltrim.jpg

  • 代码

ld.jpg

hash

  • 方法:使用hscan每次获取少量field-value,再使用hdel删除每个field
  • 命令 hscan.jpg
  • 代码

hd.jpg

set

  • 方法:使用sscan每次获取部分元素,再使用srem命令删除每个元素
  • 命令

ltrim.jpg

  • 代码 sd.jpg

zset

  • 方法:使用zscan每次获取部分元素,再使用ZREMRANGEBYRANK命令删除每个元素
  • 命令

zscan.jpg

  • 代码

zd.jpg

BigKey生产调优

阻塞和非阻塞删除命令

t1.jpg

优化配置

t2.jpg