Redis 大key和热key问题及处理

一、说说什么是Redis、及特点?

Redis是一个基于内存存储数据运行并支持持久化、使用key/value形式存储的高性能的nosql数据库,适合用于存储频繁访问,数据量较小的场景下。
特点:

  1. 支持数据持久化:可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  2. 支持多种数据结构:不仅支持简单的key-value类型数据,同时还提供string、list、set、zset、hash等数据结构的存储
  3. 支持数据备份:master-salve模式的数据备份

二、什么是大key

通常我们会将含有较大数据或含有大量成员、列表数的Key称之为大Key,下面我们将用几个实际的例子对大Key的特征进行(量化)描述:

  1. 一个STRING类型的Key,它的值为5MB(数据过大)
  2. 一个LIST类型的Key,它的列表数量为20000个(列表数量过多)
  3. 一个ZSET类型的Key,它的成员数量为10000个(成员数量过多)
  4. 一个HASH格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)

三、什么是热Key

在某个Key接收到的访问次数、显著高于其它Key时,我们可以将其称之为热Key,常见的热Key如:

  1. 某Redis实例的每秒总访问量为10000,而其中一个Key的每秒访问量达到了7000(访问次数显著高于其它Key)
  2. 对一个拥有上千个成员且总大小为1MB的HASH Key每秒发送大量的HGETALL(带宽占用显著高于其它Key)
  3. 对一个拥有数万个成员的ZSET Key每秒发送大量的ZRANGE(CPU时间占用显著高于其它Key)

四、大Key与热Key带来的问题

在Redis的使用中,大Key及热Key会给Redis带来各种各样的问题,而最常见的问题为性能下降、访问超时、数据不均衡等。

4.1 大Key带来的常见问题

  1. Client发现Redis变慢;
  2. Redis内存不断变大引发OOM,或达到maxmemory设置值引发写阻塞或重要Key被逐出;
  3. Redis Cluster中的某个node内存远超其余node,但因Redis Cluster的数据迁移最小粒度为Key而无法将node上的内存均衡化;
  4. 大Key上的读请求使Redis占用服务器全部带宽,自身变慢的同时影响到该服务器上的其它服务;
  5. 删除一个大Key造成主库较长时间的阻塞并引发同步中断或主从切换;

4.2 热Key带来的常见问题

  1. 热Key占用大量的Redis CPU时间使其性能变差并影响其它请求;
  2. Redis Cluster中各node流量不均衡造成Redis Cluster的分布式优势无法被Client利用,一个分片负载很高而其它分片十分空闲从而产生读/写热点问题;
  3. 在抢购、秒杀活动中,由于商品对应库存Key的请求量过大超出Redis处理能力造成超卖;
  4. 热Key的请求压力数量超出Redis的承受能力造成缓存击穿,此时大量强求将直接指向后端存储将其打挂并影响到其它业务;

五、大Key与热Key的常见产生原因

业务规划不足、Redis不正确的使用、无效数据的堆积、访问突增等都会产生大Key与热Key,如:

  1. 将Redis用在并不适合其能力的场景,造成Key的value过大,如使用String类型的Key存放大体积二进制文件型数据(大Key);
  2. 业务上线前规划设计考虑不足没有对Key中的成员进行合理的拆分,造成个别Key中的成员数量过多(大Key);
  3. 没有对无效数据进行定期清理,造成如HASH类型Key中的成员持续不断的增加(大Key);
  4. 预期外的访问量陡增,如突然出现的爆款商品、访问量暴涨的热点新闻、直播间某大主播搞活动带来的大量刷屏点赞、游戏中某区域发生多个工会间的战斗涉及大量玩家等(热Key);
  5. 使用LIST类型Key的业务消费侧代码故障,造成对应Key的成员只增不减(大Key);

六、找出Redis中的大Key与热Key

大Key与热Key的分析并不困难,我们有多种途径和手段来对Redis中的Key进行分析并找出其中的“问题”Key,如Redis的内置功能、开源工具、阿里云Redis控制台中的Key分析功能等。

七、大key的处理方法

大key的处理方法有两种:

  1. 拆分
  2. 删除
拆分:

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

删除:

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

八、热key的处理方法

热key的处理方法有两种:

  1. 复制
  2. 读写分离
  3. 多级缓存
    复制:

在使用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中的数据不是呈现强一致性的,而是呈现最终一致性的。这种代价也是不得不接受的,在使用缓存的时候注意不要拿缓存做逻辑,只用来做查询即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL(C++)

STL:标准模板库,它提供了一系列实现了常见数据结构和算法的模板类和函数。 STL的六大组件 容器 用于存放数据 std::string:字符串类,类比容器 std::vector:单端动态数组。支持随机访问,适合频繁访问元素…

PWARL CTF and others

title: 一些复杂点的题目 date: 2024-03-09 16:05:24 tags: CTF 2024年3月9日 今日习题完成: 1.BUU [网鼎杯 2020 半决赛]AliceWebsite 2.[RoarCTF 2019]Online Proxy 3.[Polar CTF]到底给不给flag呢 4.网鼎杯 2020 总决赛]Game Exp [RoarCTF 2019]Online Proxy …

Java设计模式之代理模式

代理模式是 Java 中常用的设计模式之一,它通过引入一个代理对象来控制对实际对象的访问,从而实现对目标对象的间接访问和控制。代理模式可以用于多种场景,比如权限控制、延迟加载、日志记录等。 在 Java 中,代理模式通常分为静态…

【软件工程导论】——软工学绪论及传统软件工程(学习笔记)

📖 前言:随着软件产业的发展,计算机应用逐步渗透到社会生活的各个角落,使各行各业都发生了很大的变化。这同时也促使人们对软件的品种、数量、功能和质量等提出了越来越高的要求。然而,软件的规模越大、越复杂&#xf…

X64 页表结构

PML4(Page Map Level 4)是x86-64架构中用于管理虚拟内存地址翻译的四级页表结构之一。它是一种树形结构,由多个页目录表(Page Directory Pointer Table,PDPT)组成,每个PDPT有512个指向下一级页表…

Hololens 2应用开发系列(3)——MRTK基础知识及配置文件配置(中)

Hololens 2应用开发系列(3)——MRTK基础知识及配置文件配置(中) 一、前言二、输入系统2.1 MRTK输入系统介绍2.2 输入数据提供者(Input Data Providers)2.3 输入动作(Input Actions)2…

Date类型及dayjs的使用总结

一、Date() Date数据类型用于处理日期和时间,它可以表示自1970年1月1日00:00:00 UTC(Coordinated Universal Time,国际协调时间)以来的毫秒数。 1.创建Date对象 例如:Tue Oct 31 2023 14:01:33 GMT0800 (中国标准时…

算法刷题day28

目录 引言一、截断数组二、双端队列三、日期统计 引言 这几道题是周赛里的几道题目,第一道题目我没用这种方法,但还是做出来了,用的一种比较特殊的思考方法,就是把每一个点都判断出来,不满足要求的就舍弃,…

【你也能从零基础学会网站开发】Web建站之javascript入门篇 JavaScript事件处理

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 什么是DHTML …

Linux基础命令[16]-head

文章目录 1. head 命令说明2. head 命令语法3. head 命令示例3.1 不加参数3.2 -c(按照字节显示)3.3 -n(按照行数显示)3.4 -v(显示文件名) 4. 总结 1. head 命令说明 head:用来显示文件开头&…

Linux认识与学习BASH

Linux认识与学习BASH 认识BASH这个Shellshell是什么系统的合法shell与/etc/shells功能Bash Shell的功能查询命令是否为Bash shell 的内置命令(type)命令的执行与快速编辑按钮 shell的变量功能什么是变量?变量的使用与设置:echo、变量设置规则、unset环境…

springboot网页时装购物系统链接

链接:https://pan.baidu.com/s/1mCmCSbqUCv48_a6wiLBdJg?pwdfalz 提取码:falz 2600套项目源码 https://kdocs.cn/l/cuAdxEBfLiqA 工作室精心制作,包括小程序项目,springboot项目,传统ssm项目,前后端分离项目。你可以用来制作自…

Stable Diffusion 模型下载:Comic Babes(漫画宝贝)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 条目内容类型大模型基础模型SD 1.5来源CIVITAI作者datmuttdoe文件名称comicBabes_v2.safet…

20240311 大模型快讯

//社区生态// 零一万物自研全导航图向量数据库。零一万物宣布推出基于全导航图的新型向量数据库笛卡尔(Descartes),已包揽权威榜单 ANN-Benchmarks 6 项数据集评测第一名。 //语言大模型// 清华发布大模型长文本理解方法InfLLM。InfLLM在没…

如何用 RAG 技术玩转文档问答?Milvus × 网易有道 QAnything 为你揭秘!

过去一年,RAG 在技术层面发展迅速,为向量数据库赛道添了一把火。RAG 和向量数据库的结合,能够有效解决幻觉、时效性差、专业领域知识不足等阻碍大模型应用的核心问题。 不久前,网易有道开源了自研的 RAG 引擎 QAnything。用户的任…

Q学习(Q-Learning)

Q学习是一种强化学习算法,用于指导代理(Agent)在给定环境中如何采取最优行动。它通过学习状态中的行动价值来实现,属于从与环境的交互中学习,通过尝试和错误,以实现目标的机器学习算法。 下面是Q学习工作原…

突破次元壁!体验数字人的神秘世界

在这个繁忙的城市,人们的生活总是充满了压力和焦虑。他们似乎总是在追寻着什么,却又不知道自己究竟在追寻什么。在这个看似平凡的世界里,隐藏着一个神秘的数字人世界。 这个数字人世界并不是虚构的,而是我们无法触及的另一个维度…

CUDA入门之统一内存

原文来自CUDA 编程入门之统一内存 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质…

vite配置

"vite": "^5.1.4" resolve.alias:配置别名 1、执行npm install -D types/node 或者 yarn add types/node -D 2、以下配置代表访问src时可以用“”代替 resolve: {alias: {"": path.resolve(__dirname, "./src"),},}, 使…

【C语言】自定义类型:结构体

1. 结构体类型的声明 1.1 结构体回顾 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1 结构的声明 struct tag {member-list; }variable-list; 例如描述⼀个学⽣: struct Stu {char name[20];//名字int age;//年…