问题
业务中有一个需求需要将数据先缓存到redis中以应对高并发的问题,然后后台定时的去将这些数据落盘mysql,叮叮当当的开发自测完成,经过测试大佬对业务功能测试和压测通过后,就马不停蹄的上线了,然而,刚上线不久,就发现服务cpu和内存占用持续升高,但没有达到100%,一只保持较高的水平。经过对服务pprof采集分析,发现居然是这个需求代码中的定时任务占用了大量的cpu占用。
问题分析
经过对代码的分析,其是使用了redis的scan扫描出那些需要落盘的key,很明显知道避免使用keys,scan很明显也是需要扫描所有的key来找到目标key,但忘记了一个主要前置情况,redis中有大量的业务缓存,具体数量有几百万个key,每次定时任务一到,就意味着它需要扫描缓存中所有的key,导致占用大量服务器资源
但因为存在与redis的网络交互,才没有达到100%,避免了服务出现宕机。-_-!
处理
临时先 采用list保存那些key,通过对list scan来避免的全key的扫描