您现在的位置是:亿华云 > 人工智能
一文了解如何发现并解决Redis热key与大key问题
亿华云2025-10-05 21:27:08【人工智能】0人已围观
简介热Key问题什么是热key?热key是服务端的常见问题,指一段时间内某个key的访问量远远超过其他的key,导致大量访问流量落在某一个redis实例中;或者是带宽使用率集中在特定的key例如,对一个包
热Key问题
什么是文解y问热key?热key是服务端的常见问题,指一段时间内某个key的现并访问量远远超过其他的key,导致大量访问流量落在某一个redis实例中;或者是解决带宽使用率集中在特定的key(例如,对一个包含2000个field的文解y问hash key每秒发送大量的hgetall操作请求);又或者是cpu使用时间占比集中在特定的key(例如,对一个包含10000个field的现并key每秒发送大量的zrange操作请求)。
以被请求频率来定义是解决否是热key,没有固定经验值。文解y问某个key被高频访问导致系统稳定性变差,现并都可以定义为热key。解决
由于热key发生对系统稳定性有巨大危害,所以需要上线前设立故障预案、建立监控和报警机制,以便快速响应故障。
如果对所有热key进行本地缓存,那么本地缓存是否会过大,高防服务器从而影响应用程序本身的性能开销。
可能需要保证本地缓存和redis数据的一致性。
热key统计可以使用LFU数据结构并结合上面的发现方法,将最热topN的key进行统计,然后在client端使用本地缓存,从而降低redis集群对热key的访问量,但这种方法带来两个问题:将热key加上前缀或者后缀,把热key的数量从1个变成实例个数,利用分片特性将这n个key分散在不同节点上,这样就可以在访问的时候,采用客户端负载均衡的方式,随机选择一个key进行访问,将访问压力分散到不同的实例中。这个方案有个明显的缺点,就是缓存的维护成本大:假如有n为100,则更新或者删除key的时候需要操作100个key。利用读写分离,通过主从复制的方式,增加slave节点来实现读请求的负载均衡。这个方案明显的缺点就是使用机器硬抗热key的数据,资源耗费严重;而且引入读写分离架构,增加节点数量,都会增加系统的复杂度降低稳定性。大Key问题
什么是大key?大key是指当redis的字符串类型占用内存过大或非字符串类型元素数量过多。
生产环境中,综合衡量运维和环境的情况,给大key定义参考值如下:
string类型的key超过10KBhash/set/zset/list等数据结构中元素个数大于5k/整体占用内存大于10MB不同系统性能条件不同,所以建议这个标准设置保守些,以系统稳定性为第一考量
可能造成的问题内存使用不均匀。例如在redis集群模式中,某个数据分片的内存使用率远超其他数据分片,无法使数据分片的内存资源达到均衡。另外也可能造成redis内存达到 maxmemory 参数定义的上限导致重要的Key被逐出,甚至引发内存溢出。响应时间上升、超时阻塞。由于redis是单线程架构,操作大key耗时较长,有可能造成redis阻塞。过期时可能阻塞。大key设定了过期时间,当过期时这个key会被删除。假如redis版本低于4.0没有非同步删除机制,就会存在阻塞redis的可能性,并且慢查询查不到;同样,内存不足时的key驱逐或者是rename一个大key也会阻塞redis服务。长时间阻塞主库,可能会引发同步中断或主从切换。慢查询为什么查不到。举例,如果请求进来且redis服务器正在进行过期键扫描,需要等待100毫秒。当客户端设置的超时时间小于100毫秒,那就会导致连接因为超时而关闭,就会造成异常,这些现象并不能从慢查询日志中查询到(因为慢查询只记录逻辑处理过程,不包括等待时间)。
网络拥塞。例如:一个大key占用空间是1MB,每秒访问1000次,就有1000MB的流量,可能造成机器或局域网的带宽被打满,同时波及其他服务。发现方法使用工具定期扫描,并建立好监控和通知机制。
优点:不阻塞服务缺点:信息较少(只有各类型最大的key信息),内容不够精确(例如hash/list/set/zset都是以元素个数衡量大key,但实际上元素个数多不代表占用内存大)。redis-cli --bigkeys 命令。可以用来找到某个实例5种数据类型(string、hash、list、set、zset)最大的key。redis-rdb-tools 工具。redis实例上执行bgsave,然后对dump出来的rdb文件进行分析。优点:获取信息更详细缺点:需要离线操作,获取结果时间较长Redis4.0之后,新增 memory usage 命令,通过随机抽样field的方式估算key的大小(样本越大,循环次数越多,计算结果越精确,性能消耗也越多)。编写python脚本,利用 scan 和 memory usage 命令,可以在集群低峰的时候扫描redis,排查大key。优点:获取信息较准确且及时缺点:python脚本需要注意不能影响线上正常服务,设置好监控和熔断。常用的处理方法大key非热key,如果不是必要的信息,可以直接删除del或者unlink都可以。如果是redis4.0之前的版本,建议对于key使用(scan/sscan/hscan/zscan),将大key逐步删除(ltrim/zremrangebyscore/hdel/srem)。redis4.0之后,直接使用unlink替换del,会有后台线程将大key异步删除。
业务拆分,将key的含义更细粒度化,避免大key出现。数据结构上拆分。如果大key是个大json,可以通过mset的方式,将这个key的内容打散到各个实例中,减小大key对数据量倾斜的影响;如果是大list,可以拆成 list_1,list_2,list_N ;其他数据结构同理。(可以考虑增加单独key存储大key被拆分的个数或元数据信息)在redis没有开启非同步删除机制的场景下,设置过期时间时,一定要避免大批量键同时过期的现象,所以如果有这种情况,最好给过期时间加个随机范围,缓解大量键同时过期,造成客户端等待超时的现象。对于长文本,更建议使用文档型数据库例如MongoDB等。对一致性要求不高的场景,尝试使用客户端缓存。(只解决了redis的阻塞问题,但机器或局域网的带宽问题没有改善)对大key的压缩。相当于用cpu资源来降低网络io,其中google提出的snappy算法较常用。对于hash等数据结构,需要注意业务是否可以引入定期清理无效field的机制。很赞哦!(7923)
相关文章
- 前面这两个步骤都是在本机完成的。到这里还没有涉及真正的域名解析服务器,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。
- 如何分析和解读Apache Webserver日志?
- 详解Tomcat三种运行模式(BIO, NIO, APR)的比较和场景分析
- 戴尔科技助力医院为病人带来高质量就医体验,收获较高满意度
- 换新域名(重新来过)
- Nginx高级篇:从原理到实战,彻底搞懂Nginx
- 数据中心投资者需要知道什么
- 程序猿面试,Elasticsearch被坑被虐的体无完肤...
- 这个不用多说,不同平台的注册价格不同,且不同平台对域名释放交易的把控与曝光不同,当然价格相对便宜且平台渠道广操作便利的平台最好。
- 女朋友问敖丙:什么是分布式事务?