热 key 和大 key 的发现和解决办法
2023年1月15日
热 key 和大 key 的发现和解决办法
热 key
带来的问题
- 热 key 占用大量的 CPU 资源,使其效率降低,影响其他业务
- 热 key 所在的节点访问量打算,容易造成物理网卡瓶颈
- 超出
redis
承受能力后,容易造成击穿,这时大量访问打到数据库上造成数据库瓶颈
解决办法
- 对热
key
根据一定的规则,增加后缀,让它变成好几个key
,分散大宋不同的节点中,减少一个节点的压力。他也有一定的问题,比如数据一致性的问题。更新一个key
变成更新多个,业务代码也要修改,增加工作量 - 对热点
key
单独做集群,他们会有独立的热点key redis
集群,和全量redis
隔离开,当然这样产生费用也是比较大的 - 使用读写分离,这样可以避免对写操作的影响,但是读写分离会有延迟的情况
- 本地缓存,可以客户端对热
key
进行收集做缓存,比如浏览器的localstorage
,安卓ios
自己的数据库,然后设置一个比较短的过期时间,比如 1 分钟,用来解决信息的更新问题。目前用此方法的比较多 - 可以系统服务自己来做,可以代码自己来实现,比如
java
的ehcache
,也可以在系统服务的服务器上安装redis
和memcache
,这样访问热key
的时候就不用和redis
交互了。
大 key
string
中的数据大于 10klist set zset
中的数据库个数大于 5000 个- 根据使用场景和业务场景来确定
带来的问题和解决
- 删除大
key
时会造成其他命令阻塞
解决
- 低访问时间段来删除
list set zset hash
可以分批次删除- 使用
unlink
替代del
命令,异步删除,放到异步现场去删除,不会阻塞主线程的命令
Loading...