redis的热key、大key

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 1.概述大key:含有较大数据或含有大量成员的Key称之为大Key,常见的大key如:String类型的Key值大于10kblist、set、zset、hash的成员个数超过5000list、set、zset、hash的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)

1.概述

大key:

含有较大数据或含有大量成员的Key称之为大Key,常见的大key如:

  • String类型的Key值大于10kb
  • list、set、zset、hash的成员个数超过5000
  • list、set、zset、hash的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)

注意:以上值只是参考,根据实际情况确定。

热key:

某个Key接收到的访问次数、显著高于其它Key时,称之为热Key。

大key带来的问题:

  1. 对Redis的请求变慢。

Redis内存不断变大引发OOM,或达到maxmemory值引发写阻塞或重要Key被逐出。

Redis Cluster中的某个node内存远超其余node。

由于对大key的请求很慢,容易造成请求的阻塞,在分布式架构下容易造成服务雪崩。

删除一个大Key很耗时,容易造成主结点阻塞,从而主从切换。

热key带来的问题:

大量请求直接打过来,服务器可能会扛不住,造成缓存击穿从而直接打挂后端存储(数据库),影响其他使用后端存储的业务。

可能使得redis的集群失去意义,Redis Cluster中各node流量不均衡造成Redis Cluster的分布式优势无法被利用,一个分片负载很高而其它分片十分空闲。

大key、热key的产生原因:

存放不合理,存储了不适合存放在内存中的数据,如用key存放音频视频这一类大体积二进制文件(大key)。

设计不合理,造成个别key中成员过多。(大key)。

未定期清理数据,没有设置过期时间,造成了如hash类型中key中的成员不断增加。

流量陡增,如出现某款爆款商品等(热key)。

bug,代码的业务逻辑上对key的成员只增不减也未设置过期时间。

2.查找方法

2.1.知道具体哪个key有问题

利用调试指令进行分析查找大key:

debug key名,对Key进行分析并返回分析结果,其中serializedlength的值为该Key的序列化长度,序列化长度可以作为key大小的判断参考,但不一定准确。而且debug命令属于调试命令,在其运行时,进入Redis的其余请求将会被阻塞直到其执行完毕。线上环境进行分析不推荐该命令。

利用操作指令进行分析查找大key:

redis的各个数据结构的操作API自带返回其成员长度的命令。利用这些命令进行分析风险更小。

292bedcf70d14228972a9cd689829f05.png

2.2.不知道具体哪个key有问题

前面的指令都是对具体的key进行分析,在不知道哪个key会有问题的时候,可以使用参数进行分析。

redis-cli的bigkeys参数用于查找大key。bigkeys仅能分别输出最大Key,如果想进行范围查询,比如找出全部成员数量超过10的hash,bigkeys是办不到的。


redis-cli的hotkeys参数用来分析热key,该参数能够返回所有Key的被访问次数,试用hotkeys的前提条件是将redis-server的maxmemory-policy参数设置为LFU。

3.处理方法

3.1.大key的处理方法

大key的处理方法有两种:

  • 拆分
  • 删除

拆分:

如将一个成员很多的hash拆分为多个hash。

删除:

将不适合Redis能力的数据存放至其它存储,并在Redis中删除此类数据。需要注意的是,删除大key可能很耗时,redis又是单线程执行的,很可能造成阻塞,Redis自4.0起提供了UNLINK命令,该命令能够异步的方式安全的删除大Key。

3.2.热key的处理方法

热key的处理方法有两种:

  • 复制
  • 读写分离
  • 多级缓存

复制:

在使用redis集群时,可以将热key复制多份,每个redis节点上存放一份,这样不存在请求的重定向使得压力全部定向到单个节点,能有效减轻单节点的压力。缺点是要进行复制的画只能在代码层手动操作,而且复制多份存放后会存在数据一致性问题。因此复制方案只能用于临时解决线上问题。

读写分离:

热key多数是读热key的操作,读写分离能保证从节点中数据的一致性,并且能轻松的横向扩展,能有效的分散压力,只是有点浪费资源,因为读写分离每个从节点上存的都是一样的数据。

多级缓存:

当热key数量不多,比如电商平台促销活动,热key都集中在少部分key上面,为此做读写分离增加机器性价比不高,使用多级缓存是个不错的解决方法。具体实现思路两种:


1.本地缓存,redis和业务服务器之间增加一个中间层(proxy),专门用来进行热key探查,这个proxy专门用来监视redis来统计达到预设的热key阈值的key,统计好后推送给业务服务器,让业务服务器存在本地缓存。


2.单独缓存,将proxy探查到的热key推送到单独的一个缓存热key的redis上去,如果扛不住,热key服务器再横向扩容,当然这个方案也是单独增加了服务器结点去处理热key的,除非保证系统中经常会有热key出现,不然的话使用本地缓存性价比更高。


使用多级缓存会存在一个问题,因为每次推送之间有时间间隔,缓存中的数据和redis中的数据不是呈现强一致性的,而是呈现最终一致性的。这种代价也是不得不接受的,在使用缓存的时候注意不要拿缓存做逻辑,只用来做查询即可。

目录
相关文章
|
7月前
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
330 61
Redis应用—6.热key探测设计与实践
|
4月前
|
NoSQL 测试技术 Redis
Redis批量删除Key的三种方式
Redis批量删除Key是优化数据库性能的重要操作,本文介绍三种高效方法:1) 使用通配符匹配(KEYS/SCAN+DEL),适合不同数据规模;2) Lua脚本实现原子化删除,适用于需要事务保障的场景;3) 管道批量处理提升效率。根据实际需求选择合适方案,注意操作不可逆,建议先备份数据,避免内存溢出或阻塞。
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
176 2
|
9月前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
131 7
|
11月前
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
11月前
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
456 0
Redis大Key问题如何排查?如何解决?
|
11月前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
12月前
|
NoSQL Unix Redis
Redis 键(key)
10月更文挑战第15天
122 1
|
12月前
|
缓存 监控 负载均衡
如何解决Redis热点Key问题?技术干货分享
【10月更文挑战第2天】在Redis的使用过程中,热点Key问题是一个常见的性能瓶颈。热点Key指的是那些被频繁访问的Key,它们可能导致Redis服务器的负载不均衡,进而影响整体性能。本文将深入探讨热点Key问题的成因、影响以及多种解决方案,帮助读者在实际工作中有效应对这一挑战。
685 3
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
884 4
Redis中大Key与热Key的解决方案

热门文章

最新文章