Redis hotkeys查询与优化
HotKeys是redis中被请求访问频率较高的Key,通常占用大量的带宽和QPS。如果在使用过程中没能及时发现并处理,可能会导致服务性能下降、用户体验变差,甚至引发大面积故障。通常预期外的访问陡增、热点事件等会导致HotKeys产生。
hotkeys查找
redis保存有每个key的访问频度,出现hotkeys后,可以通过下面方法定位(由于下面两种方式都需要实时占用系统资源,可能对运行中的系统造成影响,最有效还是通过业务层定位hotkeys,在无法确认后再使用下面方法)。
通过redis-cli的hotkeys参数查询hotkeys
客户端redis-cli支持hotkeys参数,类似bigkeys实现逻辑,使用scan指令,采样实例的key,记录并输出访问频度最高的key。
通过monitor命令分析hotkeys
Redis的monitor命令能够打印Redis中的所有请求,包括时间信息、Client信息、命令以及Key信息,可以通过短暂执行monitor命令并将输出重定向至文件,分析找出该时间段中的hotkeys。
hotkeys优化
分析出hotkeys后,通常使用对key降低请求密度来优化处理,即访问迁移或多节点支持。
使用读写分离
如果热Key的产生来自于读请求,那么读写分离是一个很好的解决方案。在使用读写分离架构时可以通过不断的增加从节点来降低每个Redis实例中的读请求压力。
在请求量极大的场景下,读写分离架构会产生不可避免的延迟,此时会有读取到脏数据的问题,需要重点关注是否满足场景需求。
分片集群key拆分
分片集群中,对hotkeys的请求打散到多分片来减少单个分片的压力,需要使用多key分别迁移到不通的分片上,应用通过请求不同的key来减少单个分片的压力。如hotkey foo复制出3个内容完全一样的Key并名为foo2,foo3,foo4,然后将这三个Key迁移到其他node来解决单一node的热Key压力。
但是该方案需要应用联动修改,同时,Key变多带来了数据一致性挑战:由更新一个Key演变为需要同时更新多个Key。