大Key
定义: 大Key是指那些值过大或元素数量过多的Key。注意:大Key是根据Value值来确定的!!!
例如,
String类型的Key,如果其值超过5MB,可能被视为大Key。
Hash类型的Key,如果超过5000个元素,可能被认定为大Key。
造成的问题:
1、内存不足:大Key占用大量内存,可能导致Redis实例的内存耗尽;
2、内存使用不均衡:大Key会使内存分配不均,影响Redis的负载均衡;
3、客户端命令变慢:对大Key的操作时间较长,会导致客户端执行命令变慢;
4、删除阻塞:大Key在删除时造成阻塞(Redis是单线程的)。
5、持久化时间长:大Key的持久化时间长,可能导致数据不一致;
解决方案:
1、拆分大Key:将一个大的Hash Key或List Key拆分成多个小的Key。
2、清理大Key:
a、使用UNLINK命令(Redis 4.0及以上版本),该命令可以异步删除大Key,避免阻塞;
b、逐步删除策略来安全地删除大Key。
3、监控内存水位:监控Redis的内存使用,设置合理的报警阈值。
4、定期清理过期数据:避免大Key的产生。
热Key
定义: 指在一段时间内访问量远超过其他Key的特定Key。热Key可能由于频繁访问导致系统负载集中在该Key上,从而引发性能问题。
造成的问题:
1、流量集中:热Key可能导致大量请求集中在Redis某一个节点,影响负载均衡;
2、CPU占用高:频繁对热Key的访问会消耗大量的CPU资源;
3、请求分配不均:由于请求集中在热Key,可能会导致系统其它部分的资源分配不均,引发性能瓶颈,甚至引发系统雪崩;
4、响应时间延长:因为其它的请求被热Key阻塞,导致响应时间延长。
如何发现:
1、业务经验预估:基于业务模型和用户行为,预估哪些Key可能成为热Key。
2、统计数据:在客户端或代理层统计访问频率,发现访问量特别高的Key。
3、Redis监控:使用Redis集群监控来发现QPS倾斜。
4、redis-cli --hotkeys:使用redis-cli --hotkeys命令来发现热点Key。
解决方案:
1、本地缓存:在客户端使用本地缓存,减少对热Key的访问。
2、分散热Key:通过给热Key添加前缀或后缀,将热Key分散到不同的节点上,避免流量集中。
3、读写分离:利用读写分离架构,增加slave节点来分担读请求。
4、阿里云Tair:使用阿里云Tair的QueryCache特性来缓存热点Key的查询结果,减轻对后端Redis的压力。
5、热点数据分片:将热Key拆分为多个小Key,并分片处理,降低单一Key的访问压力;
6、缓存预热:在高访问量来临前,提前将热Key数据加载到缓存中,减少突发的流量影响;
7、随机缓存失效时间:设置Key的过期时间时,增加随机性,避免所有缓存同时失效,导致缓存雪崩;
8、防止缓存穿透:使用布隆过滤器等技术,防止大量无效请求穿透缓存,直接访问后端数据库;