首页 > 数据库 >redis-热key大key

redis-热key大key

时间:2024-08-30 17:15:10浏览次数:9  
标签:缓存 key redis Redis 内存 Key foo

BIG KEY

作者:w08e

Big key , hot key 傻傻分不清楚

什么是大key

Redis 中的 "大 Key" 通常指的是一个占用较大内存空间的键(Key)。这可能会对 Redis 的性能产生负面影响,因为大 Key 可能导致内存碎片化、删除延迟以及网络传输时间延长等问题。

大 Key 可能出现在不同的场景中,例如:

  • 大型字符串
  • 大型列表
  • 大规模哈希表

可以通过redis内置bigkeys 获取整体统计情况

风险

大 Key 可能会导致以下问题:

  • 内存碎片化:大 Key 占用的内存块较大,可能导致内存碎片化,从而影响 Redis 的内存使用效率。

  • 网络传输延迟:传输大 Key 的数据可能会导致较长的网络传输时间,特别是在进行备份、迁移或从节点同步等操作时。

  • 删除阻塞:在删除大 Key 的过程中,可能会导致其他操作的响应时间变长。这是因为在删除大 Key 时,需要遍历键中的所有元素,并在内部进行相应的清理操作。在此期间,其他操作会等待删除操作完成。

  • 持久化延迟:如果 Redis 实例使用了持久化机制(如 RDB 快照或 AOF 日志),删除大 Key 可能会导致持久化操作的延迟,因为持久化过程也需要处理大 Key 的数据。

解决

img

HOT KEY

什么是热key

与大 Key 一样,热 Key 没有一个明确定义,通常情况下,当某个 Key 的请求频率显著高于其他 Key 时,我们就可以将其视为热 Key。

热 Key 可能会引发多种问题,包括占用大量的 CPU 资源从而影响 Redis 的吞吐量,或者在集群中可能导致流量不均衡,形成读写热点问题等。

Redis 从版本 4.0 开始引入了 hotkey 命令,允许通过客户端的 redis-cli --hotkeys 命令扫描库中的所有热点 Key。

解决

  1. 读写分离

  2. 热key备份

    我们可以将热 Key 复制到多个 Redis 实例,并在请求时随机选择一个备份实例来分散请求压力。

    比如,假如现有热 Key "foo",我们将其复制到三个分片中,分别叫做 foo_1、foo_2 与 foo_3,当请求 "foo" 时,我们为其随机添加一个后缀,从而实现分散请求压力的效果:

  3. 二级缓存

    对于一些热 Key,我们可以考虑使用一些本地缓存工具(比如 Guava 或 Ehcache) 直接将其缓存到 JVM 内存中,从根本上避免对 Redis 造成压力。

    不过,这种方案下缓存会占用额外的运行时内存,因此需要有选择进行缓存,以避免占用过多内存资源。并且当与 Redis 缓存共用时,也要考虑数据一致性问题。

标签:缓存,key,redis,Redis,内存,Key,foo
From: https://www.cnblogs.com/w08e/p/18389128

相关文章

  • redis-缓存崩溃
    缓存崩溃作者:w08eredis实战之各种崩溃雪崩击穿穿透以及预热缓存雪崩回答话术缓存雪崩是应用系统指在某个时间点上,缓存中的大部分数据同时失效,导致大量的请求直接访问底层数据库或后端服务,从而造成数据库负载剧增,甚至导致数据库崩溃的情况。通常情况下,缓存中的数据会......
  • redis-持久化
    redis数据持久化作者:w08e数据持久化三连问redis宕机数据会丢失吗回答话术先说结论,如果我们没开启任何持久化机制,那么会丢失全部数据,否则只会丢失部分数据,丢失数据的多少取决于持久化配置。Redis提供了两套持久化机制,RDB快照和AOF日志文件追加。RDB它会根据情况定期......
  • Redis多线程特性
    Redis6.0版本之前是用单线程模型,6.0版本为什么使用多线程?Redis几乎不存在CPU成为性能瓶颈的情况,主要受限于内存和网络IO内存优化内存淘汰策略增加内存硬件网络IO优化Redis在处理客户端的请求时,包括获取(socket读)、解析、执行、内容返回(socket写)等都由一个顺序串......
  • Redis高可用方案:使用Keepalived实现主备双活oZ
    注意:请确保已经安装Redis和keepalived,本文不在介绍如何安装。1、使用版本说明Redis版本:5.0.2Keepalived版本:1.3.5Linux版本:Centos7.9查看Redis版本:/usr/local/redis/bin/redis-cli-v查看Keepalived版本信息:rpm-qa|grepkeepalived或者keepalived-v2、功能实......
  • .NET 8 Moq mock GetRequiredKeyedService Setup报错b9
    .NET8MoqmockGetRequiredKeyedServiceSetup报错项目代码里有地方用到IServiceProvider.GetRequiredKeyedService来解析服务,在写单元测试时需要Mock它,本以为像下面这样写就可以了:||varserviceProvider=newMock<IServiceProvider>();||---|---|||serviceP......
  • .NET 8 Moq mock GetRequiredKeyedService Setup报错
    .NET8MoqmockGetRequiredKeyedServiceSetup报错项目代码里有地方用到IServiceProvider.GetRequiredKeyedService<T>来解析服务,在写单元测试时需要Mock它,本以为像下面这样写就可以了:varserviceProvider=newMock<IServiceProvider>();serviceProvider.Setup(x=>x.GetR......
  • Redis 内存碎片原因及清理
    一、Redis内存碎片内存碎片是指在内存分配的时候,产生的不能重复利用的空间。例如,内存空间还有3K,应用程序想申请连续的3K空间,虽然内存空间够,但是空间分配为2K,1K,总空间够,但是不连续,导致应用程序申请失败,这种无法利用的内存空间称之为"内存碎片"。内存分片会占用操作系统分配给redis......
  • Redis高可用方案:使用Keepalived实现主备双活
    注意:请确保已经安装Redis和keepalived,本文不在介绍如何安装。1、使用版本说明Redis版本:5.0.2Keepalived版本:1.3.5Linux版本:Centos7.9查看Redis版本:/usr/local/redis/bin/redis-cli-v查看Keepalived版本信息:rpm-qa|grepkeepalived或者keepalived-v2、功能实......
  • kafka指定key进行分区遇到的问题
    问题描述:kafka在指定key进行分区的时候,若某一个分区异常,则发往这个分区的数据均会失败;没有指定key进行分区的便不会出现改问题。看一下producer的源码:publicintpartition(Stringtopic,Objectkey,byte[]keyBytes,Objectvalue,byte[]valueBytes,Clustercluster){......
  • Redis全体系:基础、高级特性与性能调优
    一、Redis的内存管理Redis作为一个内存数据库,性能的关键之一就在于其高效的内存管理。在了解Redis的内存管理之前,我们需要了解其存储结构。1.Redis对象和编码Redis中的每一个数据存储在内存中都是以对象的形式存在的。Redis对象包括以下几种:字符串对象:REDIS_STRING列表......