近日遇到了Redis的一个问题,总结衍生出相关问题,具体如下:
- 什么叫Redis大key?
- 大key的危害是什么?
- 如何确定大key?
- 如何删除大key?
什么叫Redis大key?
大key,其实不是key值大,而是我们的value值很大。简单点其实就是大value。
对大key的特征有如下几点:
- String类型的key值,对应的value大约15kb
- zset、list、hash、set类型的,value值个数过多,1500左右。
大key的危害是什么?
网络阻塞
当一个大key过大, 自身会造成占用带宽较多,会连锁反应的引起这台服务器的其他服务的灾难
客户端超时
当一个大key过大,会引起请求超时,这时,后面的任务便无法正常运行了
内存过载
当读取大key的时候,会占用较多的内存,从而会导致内存溢出
影响集群
当我们删除一个大key的时候,会造成时间过长,会引发主从切换或者同步中断
如何确定大key?
redis-rdb-tools工具辅助完成
我们借助第三方工具,可以解析Redis的快照文件,辅助我们快速定位大key。下面这条命令可以帮助我们定位20KB的大key
dump.rdb -c memory --bytes 20480 -f redis.csv
redis自带的redis-cli,来找出大key
可以通过redis-cli --bigkeys来查找出大key信息
如何删除大key?
分批次删除
删除list
通过Itrim命令,每次删除少量元素
删除set
使用sscan命令,每次扫描150个元素,在用srem命令每次删除一个
删除zset
使用zremrangebyrank命令每次删除150个元素
删除hash
使用hscan命令,每次获取150个字段,在用hdel命令,每次删除一个字段。这样就可以了
异步删除
redis 4.0 版本以上支持了异步删除功能
用unlink命令代替del命令来删除,这样Redis会将这个key放入到一个异步现成中进行删除,这样不会阻塞主线的运行。
好了,今天先聊到这吧,下期我们来聊一聊如何解决大key问题
欢迎大家关注我的公众号《coder练习生》