首页 > 其他分享 >大Key

大Key

时间:2024-07-06 20:20:26浏览次数:9  
标签:成员 清理 Redis 阻塞 Key 数据

如何定义

以 Key 的大小和Key中成员的数量来综合判定,例如:

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

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

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

危害

  • 内存不均:单 Value 较大时候,可能会导致节点之间内存使用不均匀,导致负载不均衡。
  • 阻塞请求:redis 为单线程,单 Value 较大读写需要较长的处理时间,会阻塞后续的请求处理。
  • 阻塞网络:单 Value 较大时会占用服务器网卡较多带宽,可能导致出口带宽打满,影响该服务器傻姑娘单其它 Redis 实例或应用。
  • 删除阻塞:对大Key执行删除操作,易造成主库较长时间的阻塞,进而可能引发同步中断或主从切换。

产生的原因

  • 在不适用的场景下使用Redis,易造成Key的value过大,如使用String类型的Key存放大体积二进制文件型数据;

  • 业务上线前规划设计不足,没有对Key中的成员进行合理的拆分,造成个别Key中的成员数量过多;

  • 未定期清理无效数据,造成如HASH类型Key中的成员持续不断地增加;

  • 使用LIST类型Key的业务消费侧发生代码故障,造成对应Key的成员只增不减。

处理方案

  • 对大Key进行拆分。例如将含有数万成员的一个HASH Key拆分为多个HASH Key,并确保每个Key的成员数量在合理范围。在Redis集群架构中,拆分大Key能对数据分片间的内存平衡起到显著作用。

  • 对过期数据进行定期清理。堆积大量过期数据会造成大Key的产生,例如在HASH数据类型中以增量的形式不断写入大量数据而忽略了数据的时效性。可以通过定时任务的方式对失效数据进行清理。在清理HASH数据时,建议通过HSCAN命令配合HDEL命令对失效数据进行清理,避免清理大量数据造成Redis阻塞。

 

  • 对大Key进行清理,将不适用Redis能力的数据存至其它存储,并在Redis中删除此类数据。
    • Redis 4.0及之后版本:您可以通过UNLINK命令安全地删除大Key甚至特大Key,该命令能够以非阻塞的方式,逐步地清理传入的Key。
    • Redis 4.0之前的版本:建议先通过SCAN命令读取部分数据,然后进行删除,避免一次性删除大量key导致Redis阻塞。

应用

比如100万个string对象,test1、test2、。。。testN。将100万个键,映射到1000个hash中,每个hash保存1000个元素。

映射规则:Hash(原key)% 1000得到新key,field为原key,value保存原对象值。

额外用一组hash记录field过期时间。

数据读取时,需要通过hget(Hash(原key)% 1000, field)。

标签:成员,清理,Redis,阻塞,Key,数据
From: https://www.cnblogs.com/zhengbiyu/p/18287680

相关文章

  • WPF MVVM capture window keyboard
    //xaml<behavior:Interaction.Triggers><behavior:EventTriggerEventName="KeyDown"><behavior:CallMethodActionTargetObject="{Binding}"MethodName="Window_KeyDown"/></beha......
  • 在 Windows 操作系统中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tc
    在Windows操作系统中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下的两个重要参数控制着TCP/IP协议栈的行为。这些参数可以通过注册表来配置,影响网络连接和端口资源的管理。1.MaxUserPort路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe......
  • 在注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager
    在注册表路径HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\SessionManager\MemoryManagement下的LargeSystemCache键控制着操作系统如何管理系统缓存和内存分配,不同的数值对应不同的行为和设置。LargeSystemCache参数详解0(默认值):效果:系统将系统缓存减少到最......
  • 在注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Man
    在注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement下的DisablePagingExecutive键控制着操作系统内核数据是否允许分页到页面文件中。这个设置对系统性能和稳定性有重要影响,特别是在高负载和内存紧张的情况下。DisablePagi......
  • 云计算渲染时代:选择Blender或KeyShot进行高效渲染
    在云渲染技术日益成熟的背景下,挑选一款贴合项目需求的3D渲染软件显得尤为关键。当前,Blender与KeyShot作为业界领先的全能渲染解决方案,广受推崇。它们虽皆能创造出令人信服的逼真视觉效果,但在特色功能上各有所长。本篇文章旨在深入剖析Blender与KeyShot的核心渲染能力,并指导用户如......
  • [1022] Activate specific apps using keyboard shortcuts
    Thisisaverygoodone!!! TaskbarShortcutKeys:Ifanappispinnedtoyourtaskbar,youcanusethefollowingshortcut:PressWin+1toactivatethefirstprogramonthetaskbar(orlaunchitifit’snotopen).Similarly,Win+2activatesthesec......
  • 浅谈一下Mybatis当中插入主键返回的两个属性(useGeneratedKeys,selectKey)
    useGeneratedKeys和selectKey的区别今天遇见两个Mybatis当中很有像似点的属性,仔细研究了会.发现还是有带你不同.useGenerateKeys其值为true和false,表明是否将插入生成的主键返回到参数当中.useGeneratedKey属性会自动根据驱动生成对应SQL语句useGeneratedKey只支持“......
  • 京东毫秒级热key探测框架设计与实践,已实战于618大促
    在拥有大量并发用户的系统中,热key一直以来都是一个不可避免的问题。或许是突然某些商品成了爆款,或许是海量用户突然涌入某个店铺,或许是秒杀时瞬间大量开启的爬虫用户,这些突发的无法预先感知的热key都是系统潜在的巨大风险。风险是什么呢?主要是数据层,其次是服务层。热key对数据......
  • Redis 可以根据消息存储时长 将key 删除吗
    是的,Redis可以根据消息的存储时长(TTL,Time-To-Live)自动删除键。您可以通过设置键的过期时间来实现这一点。以下是一些相关的命令和使用示例:设置过期时间的命令EXPIRE:为键设置过期时间(以秒为单位)。EXPIREkeysecondsPEXPIRE:为键设置过期时间(以毫秒为单位)。PEXPIREkey......
  • 使用 Tampermonkey 在页面加载完5秒后监听特定页面元素的点击事件并修改 API 返回的数
    示例 //==UserScript==//@nameNewUserscript//@namespacehttp://tampermonkey.net///@version2024-07-04//@descriptiontrytotakeovertheworld!//@authorYou//@matchhttps://a.x.com/*//@iconhttps://www.......