Redis大Key问题 - 标准、原因、查找

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【6月更文挑战第13天】**大Key标准**在不同场景各异,一般string超1MB或容器超10k元素视为大;高并发场景中,string超10KB,容器超5k或整体10MB。**阿里云Redis**中,大Key可能表现为String值5MB,ZSET成员10k,或Hash总值100MB。**大Key影响**包括高读取成本、操作阻塞、存储压力不均。**产生原因**多源于业务设计、动态增长管理和程序错误。**查找大Key**可通过云服务的实时/离线统计,`redis-cli --bigkeys`或使用Redis RDB Tools分析RDB文件。注意,某些特定需求可能需额外工具。

大key的标准

一般的业务场景下,对并发和容量要求都不大:

  • 单个string的value超过1MB

  • 容器数据结构元素数量超过10000

在高并发且低延迟的场景里:

  • 单个string的value超过10KB

  • 容器数据结构元素数量超过5k或是整体value超过10MB

阿里云的云Redis:

  • Key本身的数据量过大:一个String类型的Key,它的值为5 MB。

  • Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个。

  • Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有2,000个但这些成员的Value(值)总大小为100 MB。

大Key的影响

  1. 读取成本高

    • 时延高,因为执行命令时间更长

    • 消耗更多的带宽,导致自身服务变慢,从而影响相关服务

  2. 大Key相关操作容易阻塞,从而导致无法正常响应

    • 慢查询变多

    • 删除的时候容易导致主库长时间的阻塞,进而可能引发同步中断或主从切换

  3. 占用更多的存储空间,内存达到maxmemory参数定义的上限引发操作阻塞或重要的key被逐出,甚至是OOM

  4. 集群架构下,某个数据分片的内存使用率远超其他数据分片,导致数据分片的内存资源分配不均衡

大key产生的原因

  1. 业务设计不合理:最常见的原因,不经过合理的拆分,就把大json塞在一个key里,甚至塞二进制文件数据。没有对key中的成员进行合理的拆分,造成个别key中的成员数量过多。

  2. 没有处理好value的动态增长问题。如果一直添加value数据的话,没有定期的删除机制、合理的过期机制,或是没有设定合适的阈值,早晚会变成大key。例如:微博明星的粉丝列表、热门评论、直播弹幕

  3. 程序bug:某些异常情况导致某些key的生命周期超出预期,或是value数量异常增长。使用LIST类型key的业务消费侧发生代码故障,造成对应的key的成员只增不减。

如何找到大key

云Redis提供的服务

云服务提供的实时Top Key统计服务或是离线全量Key分析服务

通过redis-cli的bigkeys命令

Redis提供了bigkeys参数能够使redis-cli以遍历的方式分析Redis实例中的所有key,并返回key的整体统计信息与每个数据类型中Top1的大key,bigkeys只能分析并输入六种数据类型(STRING,LIST,HASH,SET,ZSET,STREAM),命令示例

redis-cli -h r-***************.redis.rds.aliyuncs.com -a <password> --bigkeys

注意:若只需要分析STRING类型的大key或是找出成员数量超过10个的HASH Key,则bigkeys参数无法直接实现该类需求。

Redis RDB Tools工具

支持定制化分析的开源工具 GitHub - sripathikrishnan/redis-rdb-tools: Parse Redis dump.rdb files, Analyze Memory, and Export Data to JSON 通过分析RDB文件,扫描出Redis的大key

可以根据自己的精细化需求,全面地分析所有Key的内存占用情况,而且对线上服务无影响。但是因为RDB文件较大时耗时较长。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
1月前
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
21天前
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
53 0
Redis大Key问题如何排查?如何解决?
|
22天前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
2月前
|
NoSQL Unix Redis
Redis 键(key)
10月更文挑战第15天
35 1
|
2月前
|
缓存 监控 负载均衡
如何解决Redis热点Key问题?技术干货分享
【10月更文挑战第2天】在Redis的使用过程中,热点Key问题是一个常见的性能瓶颈。热点Key指的是那些被频繁访问的Key,它们可能导致Redis服务器的负载不均衡,进而影响整体性能。本文将深入探讨热点Key问题的成因、影响以及多种解决方案,帮助读者在实际工作中有效应对这一挑战。
101 3
|
2月前
|
NoSQL Redis
redis 的 key 过期策略是怎么实现的(经典面试题)超级通俗易懂的解释!
本文解释了Redis实现key过期策略的方式,包括定期删除和惰性删除两种机制,并提到了Redis的内存淘汰策略作为补充,以确保过期的key能够被及时删除。
60 1
|
3月前
|
存储 缓存 NoSQL
Redis 大 Key 对持久化的影响及解决方案
Redis 大 Key 对持久化的影响及解决方案
49 1
|
3月前
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
262 4
Redis中大Key与热Key的解决方案
|
3月前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
99 3