redis大key问题记录

252 阅读1分钟

大key的意思不是key值大,而是存的value大。

1.大key主动删除问题

  • del 删除大key的时候,直接删除会阻塞服务的。
  • unlink key redis会启动一个线程,异步删除 4.0版本开始
原因:Redis 需要依次释放每个元素的内存,元素越多,这个过程就会越耗时
  • 主动增量删除
SCAN 增量迭代当前数据库中的数据库键。

SSCAN 增量迭代集合键中的元素
       配合srem命令
       
HSCAN 增量迭代哈希键中的键值对
       配合hdel

ZSCAN 增量迭代有序集合中的元素
      配合ZREMRANGEBYRANK,ZREMRANGEBYSCORE

2.大key检测

  • 系统命令 bigkeys
  • 工具redis-rdb-tools 离线分析rdb文件
dump.rdb 按照文件统计, 将所有 > 10kb 的 key 输出到一个 csv 文件
rdb dump.rdb -c memory --bytes 10240 -f live_redis.csv
  • key内存分析 MEMORY USAGE keyname1
  • 公有云的Redis分析服务发现大Key及热Key

3.大key优化处理

可以尝试将对象分拆成几个key-value

  • 1.value string字符串的可以进行序列化(protobuf)或者压缩(GZIP),编解码会耗时
  • 压缩没效果的根据一些属性进行拆分;mget
  • 2.hash, set,zset,list 中存储过多的元素,需要进行拆分
主要是hashkey的定义如何去的到真正的key
key=keyStart+hash(hashkey)%100
  • 3.hash后分片处理