Redis经常因为各种大key/hot key的问题未及时处理导致服务器的性能下降:
什么是大key
大key的具体表现是:redis的key对应的value很大,占用Redis的空间比较大,本质上是大Value的问题。
1.对于String,value超过10M,(数据值太大)
2.set、list类型value,含有的成员10000(成员数量多)
redis是单线程执行指令的,当前面的任务完成不了,后边的命令就会阻塞,从而导致如下的结果:
1、请求响应时间上升,超时阻塞。
2.同步中断,或者主从切换
内不足,对大key,进行驱逐操作,或者rename一个大key,容易长时间阻塞主库,进而引发同步中断或者主从切换。
3.网络拥堵,一个大key占用的空间是1M,每秒访问1000次,占用1000M的流量,可能造成实际或者局域网的带宽被占满,自身服务变慢,同时影响其他的服务。
4.内存使用不均匀:在Redis集群中,某个数据分片的内存使用率远超其他数据分片,内存资源无法达到均衡,另外,Redis内存可能达到MAXmemory,甚至内存溢出。
对于Java应用来讲,高并发场景大key,问题容易导致应用服务器CPU load /内存占用飙高。
大key如何产生的:
1.错误技术选型:
比如使用String类型key,存放大体积二进制文件数据,从而造成key的value值特别大。
2、List,Set 未清理:
比如:生产者发送消息快,消费者慢,导致数据堆积占用大量内存空间。
3、数据没有合并做分片:
业务上线前:对业务分析不准确,没有对key中的成员进行合理的分析,造成个别key的成员数量过多。
如何找到大key
1、bigkeys-命令
这个指令执行后:会输出每种数据类型中的大的bigkey的信息。
2、通过监控平台:
如何解决大key
1.针对list,set这种在使用的过程中,list和set中对应的不断增加,需要定时对list和生set进行清理
2.压缩大key的value值:
3.拆分大key
浙公网安备 33010602011771号