Redis - 热点key
2020-04-01 本文已影响0人
万福来
Redis - 热点key
热key问题描述
热key问题就是突然有几十万的请求去访问redis上的某个特定key,那么这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis服务器直接宕机。
如何发现热点key
- 凭借业务经验,进行预估哪些是热key。比如某些商品要做秒杀,则商品key就可以判断为热key。但并非所有业务都能预估出热key。
- 在客户端进行收集。比如在redis客户端执行redis命令之前,加入一行代码进行命令数据收集,,然后通过网络将收集的命令发送出去,确定是对客户端代码有入侵。
- 在Proxy层做收集。但是并非所有的redis集群都有proxy。
- 用redis自带命令。monitor命令可以实时抓取出redis服务器接收到的命令,然后写代码统计出热key是啥,不过高并发条件下,有内存暴增的隐患,影响redis的性能。redis4.0.3提供了客户端热点key发现功能,如果key比较多,执行比较慢。
- 自己抓包评估,redis客户端使用TCP协议与服务端进行交互,通信协议采用RESP,自己写程序监听端口,按照RESP协议规则解析数据进行分析,不过开发成本较高,不易维护。
如何解决热key
- 增加二级缓存,发现热key以后,可以把热key数据加载到系统JVM并设置合适的缓存过期时间,针对热key的请求就会直接分散到各业务服务器上,防止所有请求同时访问同一台redis。
- 备份热key。可以把热点key的数据备份到所有redis的集群节点中,可以通过在热点key后面拼接集群节点编号,然后将这些备份key分散到所有集群节点中,客户端访问热点key的时候也在热点key后面随机拼接集群节点编号,将热点key的请求分散到不同集群节点上。
有赞透明多级缓存解决方案(TMC)
TCM对原生jedis包得jedisPool和jedis类做改造,在JedisPoll初始化过程中集成了TCM“热点发现”+“本地缓存"功能Hermes-sdk包得初始化逻辑。