一、什么是大key?
首先大key不是key很大而是key对应的value值很大,一般而言如果String类型值大于10KB,Hash,Set,Zset,List类型的元素的个数大于5000个都可以称之为大key.
二、大key的危害
三、定位大key
1、redi-cli --bigkeys
使用时注意事项:最好在从节点上执行该命令或者在Redis实例业务压力的低峰阶段进行扫描查询,因为key很多时会很慢
不足之处
2.使用SCAN命令查找大key
3.使用RdbTools
使用第三方开源工具,可以解析Redis快照,找到其中的大key
四、删除大key
1.分批次删除
使用SCAN扫描key,比如删除Hash,先取100字段删除删除再取
在Redis4.0版本开始,可以采用异步删除法用unlink命令代替del删除
这样Redis会将这个key放入到一个异步线程中进行删除,这样不会阻塞主线程
前面两种都是主动删除,这一种是通过配置参数,当认为需要删除的时候就删除了
建议开启其中的 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-server-del 等配置,这样就可以有效的提高主线程的执行效率
五、如何避免大key
1.对大key进行拆分
将一个Big Key拆分为多个key-value这样的小Key,并确保每个key的成员数量或者大小在合理范围内,然后再进行存储,通过get不同的key或者使用mget批量获取。
2.对大key进行清理
对Redis中的大Key进行清理,从Redis中删除此类数据。Redis自4.0起提供了UNLINK命令,该命令能够以非阻塞的方式缓慢逐步的清理传入的Key,通过UNLINK,你可以安全的删除大Key甚至特大Key
通过监控系统并设置合理的Redis内存报警阈值来提醒我们此时可能有大Key正在产生,如:Redis内存使用率超过70%,Redis内存1小时内增长率超过20%等。
使用序列化、压缩算法将key的大小控制在合理范围内,但是需要注意序列化、反序列化都会带来一定的消耗。如果压缩后,value还是很大,那么可以进一步对key进行拆分。