大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后分片处理