热 key 和大 key 的发现和解决办法

wxvirus2023年1月15日
大约 2 分钟

热 key 和大 key 的发现和解决办法

热 key

带来的问题

  • 热 key 占用大量的 CPU 资源,使其效率降低,影响其他业务
  • 热 key 所在的节点访问量打算,容易造成物理网卡瓶颈
  • 超出redis承受能力后,容易造成击穿,这时大量访问打到数据库上造成数据库瓶颈

解决办法

  • 对热key根据一定的规则,增加后缀,让它变成好几个key,分散大宋不同的节点中,减少一个节点的压力。他也有一定的问题,比如数据一致性的问题。更新一个key变成更新多个,业务代码也要修改,增加工作量
  • 对热点key单独做集群,他们会有独立的热点key redis集群,和全量redis隔离开,当然这样产生费用也是比较大的
  • 使用读写分离,这样可以避免对写操作的影响,但是读写分离会有延迟的情况
  • 本地缓存,可以客户端对热key进行收集做缓存,比如浏览器的localstorage,安卓ios自己的数据库,然后设置一个比较短的过期时间,比如 1 分钟,用来解决信息的更新问题。目前用此方法的比较多
  • 可以系统服务自己来做,可以代码自己来实现,比如javaehcache,也可以在系统服务的服务器上安装redismemcache,这样访问热key的时候就不用和redis交互了。

大 key

  • string中的数据大于 10k
  • list set zset中的数据库个数大于 5000 个
  • 根据使用场景和业务场景来确定

带来的问题和解决

  • 删除大key时会造成其他命令阻塞

解决

  • 低访问时间段来删除
  • list set zset hash可以分批次删除
  • 使用unlink替代del命令,异步删除,放到异步现场去删除,不会阻塞主线程的命令
Loading...