本文正在参加「金石计划」

1. 什么是Redis大key问题
Redis大key问题指的是某个key对应的value值所占的内存空间比较大,导致Redis的功能下降、内存不足、数据不均衡以及主从同步推迟等问题。
究竟多大的数据量才算是大key?
没有固定的判别规范,通常认为字符串类型的key对应的value值占用空间大于1M,或许集合类型的k元素数量超过1万个,就算是大key。
Redis大key问题的定义及评判原则并非原封不动,而应根据Redis的实际运用以及事务需求来综合评估。例如,在高并发且低推迟的场景中,仅10kb或许就已构成大key;然而在低并发、高容量的环境下,大key的边界或许在100kb。因而,在规划与运用Redis时,要依据事务需求与功能指标来建立合理的大key阈值。
2. 大key带来的影响
- 内存占用过高。大Key占用过多的内存空间,或许导致可用内存不足,然后触发内存筛选战略。在极端情况下,或许导致内存耗尽,Redis实例溃散,影响体系的稳定性。
- 功能下降。大Key会占用很多内存空间,导致内存碎片添加,然后影响Redis的功能。对于大Key的操作,如读取、写入、删去等,都会消耗更多的CPU时刻和内存资源,进一步下降体系功能。
- 堵塞其他操作。某些对大Key的操作或许会导致Redis实例堵塞。例如,运用DEL指令删去一个大Key时,或许会导致Redis实例在一段时刻内无法响应其他客户端恳求,然后影响体系的响应时刻和吞吐量。
- 网络拥塞。每次获取大key发生的网络流量较大,或许形成机器或局域网的带宽被打满,同时涉及其他服务。例如:一个大key占用空间是1MB,每秒访问1000次,就有1000MB的流量。
- 主从同步推迟。当Redis实例装备了主从同步时,大Key或许导致主从同步推迟。因为大Key占用较多内存,同步过程中需求传输很多数据,这会导致主从之间的网络传输推迟添加,然后影响数据一致性。
- 数据歪斜。在Redis集群形式中,某个数据分片的内存运用率远超其他数据分片,无法使数据分片的内存资源达到均衡。另外也或许形成Redis内存达到maxmemory参数定义的上限导致重要的key被逐出,乃至引发内存溢出。
3. 大key发生的原因
- 事务规划不合理。这是最常见的原因,不应该把很多数据存储在一个key中,而应该分散到多个key。例如:把全国数据按照省行政区拆分成34个key,或许按照城市拆分成300个key,能够进一步下降发生大key的概率。
- 没有预见value的动态增加问题。假如一直添加value数据,没有删去机制、过期机制或许限制数量,早晚呈现大key。例如:微博明星的粉丝列表、热门谈论等。
- 过期时刻设置不当。假如没有给某个key设置过期时刻,或许过期时刻设置较长。随着时刻推移,value数量快速累积,终究形成大key。
- 程序bug。某些反常情况导致某些key的生命周期超出预期,或许value数量反常增加 ,也会发生大key。
4. 怎样排查大key
4.1 SCAN指令
经过运用Redis的SCAN指令,我们能够逐步遍历数据库中的一切Key。结合其他指令(如STRLEN、LLEN、SCARD、HLEN等),我们能够识别出大Key。SCAN指令的优势在于它能够在不堵塞Redis实例的情况下进行遍历。
4.2 bigkeys参数
运用redis-cli指令客户端,连接Redis服务的时候,加上 —bigkeys 参数,能够扫描每种数据类型数量最大的key。
redis-cli -h 127.0.0.1 -p 6379 —bigkeys
4.3 Redis RDB Tools东西
运用开源东西Redis RDB Tools,分析RDB文件,扫描出Redis大key。
例如:输出占用内存大于1kb,排名前3的keys。
rdb —commond memory —bytes 1024 —largest 3 dump.rbd
5. 怎样解决大key
- 拆分成多个小key。这是最简单想到的办法,下降单key的巨细,读取能够用mget批量读取。
- 数据紧缩。运用String类型的时候,运用紧缩算法削减value巨细。或许是运用Hash类型存储,因为Hash类型底层运用了紧缩列表数据结构。
- 设置合理的过期时刻。为每个key设置过期时刻,并设置合理的过期时刻,以便在数据失效后主动整理,避免长时刻累积的大Key问题。
- 启用内存筛选战略。启用Redis的内存筛选战略,例如LRU(Least Recently Used,最近最少运用),以便在内存不足时主动筛选最近最少运用的数据,避免大Key长时刻占用内存。
- 数据分片。例如运用Redis Cluster将数据分散到多个Redis实例,以减轻单个实例的担负,下降大Key问题的危险。
- 删去大key。运用UNLINK指令删去大key,UNLINK指令是DEL指令的异步版别,它能够在后台删去Key,避免堵塞Redis实例。
6. 总结
大Key问题是Redis中常见的问题之一,或许导致功能下降、内存占用过高、堵塞其他操作以及主从同步推迟等问题。本文详细介绍了大Key发生的原因、影响、检测办法和解决方案。经过优化数据结构规划、设定合理的数据过期战略、优化体系架构和装备,以及渐进式删去大Key等办法,我们能够有效地解决和防备大Key问题,然后进步Redis体系的稳定性和功能。
我是「一灯架构」,假如本文对你有协助,欢迎各位小伙伴点赞、谈论和关注,感谢各位老铁,我们下期见