Redis 大key、热key优化
大key
分为两种:字符串类型长度很大以及非字符串类型的数据结构中元素很多
-
危害:
- 集群模式下,内存分配不均,不利于集群管理
- 非字符串的数据结构例如hash,执行hgetall时,大key会导致阻塞
- 过期删除大key导致阻塞
- 读大key时网络阻塞
-
监控:
- 找运维,让他们在从节点上监控,利用scan + memory usage方式。
- 找架构组,在客户端改造或者中间proxy上改造,统计每次写入redis的数据大小,写入elasticsearch,然后在es上做监控报警。这种方式实时但是不全面,会漏掉通过追加变成bigkey的key。
-
找到之后第一步 删除 (如果对业务有影响,则先做第二步,再做第一步)
- 对字符串,直接del,不阻塞
- 对于非字符串,利用hscan、ltrim、sscan、zscan,分多批删除
-
找到之后第二步 优化
- 拆分,拆成多个key,让其散列到集群下的不同节点中。比如按userId拆、按时间拆。
热key
场景比如某个抢购商品的基础信息、库存。
-
危害:
- 集群模式下,大量的压力干到一个节点上
-
监控:
- 找架构组,在客户端改造或者中间proxy上改造,统计每次请求,输出到elasticsearch,然后在es上做监控报警
-
优化:
- 集群模式下,需要将请求分散到不同节点上。例如库存,可以拆多块分散到不同节点
- 多级缓存,将热点key用服务器来做缓存(堆内concurrenthashmap,堆外ecache),利用发布订阅或者其他消息中间件来更新。