Redis 大key和热key问题及处理
一、说说什么是Redis、及特点?
Redis是一个基于内存存储数据运行并支持持久化、使用key/value形式存储的高性能的nosql数据库,适合用于存储频繁访问,数据量较小的场景下。
特点:
- 支持数据持久化:可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- 支持多种数据结构:不仅支持简单的key-value类型数据,同时还提供string、list、set、zset、hash等数据结构的存储
- 支持数据备份:master-salve模式的数据备份
二、什么是大key
通常我们会将含有较大数据或含有大量成员、列表数的Key称之为大Key,下面我们将用几个实际的例子对大Key的特征进行(量化)描述:
- 一个STRING类型的Key,它的值为5MB(数据过大)
- 一个LIST类型的Key,它的列表数量为20000个(列表数量过多)
- 一个ZSET类型的Key,它的成员数量为10000个(成员数量过多)
- 一个HASH格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)
三、什么是热Key
在某个Key接收到的访问次数、显著高于其它Key时,我们可以将其称之为热Key,常见的热Key如:
- 某Redis实例的每秒总访问量为10000,而其中一个Key的每秒访问量达到了7000(访问次数显著高于其它Key)
- 对一个拥有上千个成员且总大小为1MB的HASH Key每秒发送大量的HGETALL(带宽占用显著高于其它Key)
- 对一个拥有数万个成员的ZSET Key每秒发送大量的ZRANGE(CPU时间占用显著高于其它Key)
四、大Key与热Key带来的问题
在Redis的使用中,大Key及热Key会给Redis带来各种各样的问题,而最常见的问题为性能下降、访问超时、数据不均衡等。
4.1 大Key带来的常见问题
- Client发现Redis变慢;
- Redis内存不断变大引发OOM,或达到maxmemory设置值引发写阻塞或重要Key被逐出;
- Redis Cluster中的某个node内存远超其余node,但因Redis Cluster的数据迁移最小粒度为Key而无法将node上的内存均衡化;
- 大Key上的读请求使Redis占用服务器全部带宽,自身变慢的同时影响到该服务器上的其它服务;
- 删除一个大Key造成主库较长时间的阻塞并引发同步中断或主从切换;
4.2 热Key带来的常见问题
- 热Key占用大量的Redis CPU时间使其性能变差并影响其它请求;
- Redis Cluster中各node流量不均衡造成Redis Cluster的分布式优势无法被Client利用,一个分片负载很高而其它分片十分空闲从而产生读/写热点问题;
- 在抢购、秒杀活动中,由于商品对应库存Key的请求量过大超出Redis处理能力造成超卖;
- 热Key的请求压力数量超出Redis的承受能力造成缓存击穿,此时大量强求将直接指向后端存储将其打挂并影响到其它业务;
五、大Key与热Key的常见产生原因
业务规划不足、Redis不正确的使用、无效数据的堆积、访问突增等都会产生大Key与热Key,如:
- 将Redis用在并不适合其能力的场景,造成Key的value过大,如使用String类型的Key存放大体积二进制文件型数据(大Key);
- 业务上线前规划设计考虑不足没有对Key中的成员进行合理的拆分,造成个别Key中的成员数量过多(大Key);
- 没有对无效数据进行定期清理,造成如HASH类型Key中的成员持续不断的增加(大Key);
- 预期外的访问量陡增,如突然出现的爆款商品、访问量暴涨的热点新闻、直播间某大主播搞活动带来的大量刷屏点赞、游戏中某区域发生多个工会间的战斗涉及大量玩家等(热Key);
- 使用LIST类型Key的业务消费侧代码故障,造成对应Key的成员只增不减(大Key);
六、找出Redis中的大Key与热Key
大Key与热Key的分析并不困难,我们有多种途径和手段来对Redis中的Key进行分析并找出其中的“问题”Key,如Redis的内置功能、开源工具、阿里云Redis控制台中的Key分析功能等。
七、大key的处理方法
大key的处理方法有两种:
- 拆分
- 删除
拆分:
如将一个成员很多的hash拆分为多个hash。
删除:
将不适合Redis能力的数据存放至其它存储,并在Redis中删除此类数据。需要注意的是,删除大key可能很耗时,redis又是单线程执行的,很可能造成阻塞,Redis自4.0起提供了UNLINK命令,该命令能够异步的方式安全的删除大Key。
八、热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中的数据不是呈现强一致性的,而是呈现最终一致性的。这种代价也是不得不接受的,在使用缓存的时候注意不要拿缓存做逻辑,只用来做查询即可。
相关文章:
Redis 大key和热key问题及处理
一、说说什么是Redis、及特点? Redis是一个基于内存存储数据运行并支持持久化、使用key/value形式存储的高性能的nosql数据库,适合用于存储频繁访问,数据量较小的场景下。 特点: 支持数据持久化:可以将内存中的数据保…...
SpringBoot中RestTemplate 发送http请求
SpringBoot中RestTemplate 发送http请求 引入fastjson <!--fastjson--> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.47</version> </dependency>创建配置文件 新建c…...
HTTP有什么缺陷,HTTPS是怎么解决的
缺陷 HTTP是明文的,谁都能看得懂,HTTPS是加了TLS/SSL加密的,这样就不容易被拦截和攻击了。 SSL是TLS的前身,他俩都是加密安全协议。前者大部分浏览器都不支持了,后者现在用的多。 对称加密 通信双方握有加密解密算法…...
OWASP Top 10 网络安全10大漏洞——A02:A02:2021-加密机制失效
10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化,以及一些合并。 A02:A02:2021-加密机制失效 上升一个位置,当前top2,以前称为敏感数据泄露,是一种状况而不是根本原因。更新后的类别…...
2024-3-11-C++作业
1>试编程 要求: 提示并输入一个字符串,统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 源代码: #include <iostream>using namespace std;int main() {string s;cout << "请输入字符串:"…...
Spring Boot 实现文件本地以及OSS上传
Spring Boot 实现文件上传 Maven依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version> </dependency>上传到本地 package yang.controller;import java.…...
如何选择一家优秀的APP开发公司?
在移动应用市场的激烈竞争中,选择一家合适的APP开发公司至关重要。然而,仅仅选择了一家公司并不足以确保项目的成功。本文将为您详细介绍选择好APP开发公司后,还应该注意的关键因素,并引入虎克技术公司的以往合作客户的过程中给出…...
【美团笔试】20240309—春招、暑期实习实习笔试
【美团笔试】20240309—春招实习笔试真题 文章目录 【美团笔试】20240309—春招实习笔试真题1. 小美的MT2. 小美的数组询问3. 小美的平衡矩阵(前缀和)4. 小美的区间删除5. 小美的朋友关系参考1. 小美的MT MT 是美团的缩写,因此小美很喜欢这两个字母。现在小美拿到了一个仅由…...
4-LINUX--文件操作命令
一、文件查看命令 1. cat 1.1 查看文件内容,示例如下: 1.2 合并文件,示例如下: 1.3 往文件中写入数据, Ctrld 是结束输入,示例如下: 2. more 当一个文件的内容超过一个屏幕能显示的行数…...
浏览器缓存 四种缓存分类 两种缓存类型
浏览器缓存 本文主要包含以下内容: 什么是浏览器缓存按照缓存位置分类 Service WorkerMemory CacheDisk CachePush Cache 按照缓存类型分类 强制缓存协商缓存 缓存读取规则浏览器行为 什么是浏览器缓存 在正式开始讲解浏览器缓存之前,我们先来回顾一…...
html5cssjs代码 003 50以内的乘法算式
html5&css&js代码 003 50以内的乘法算式 一、代码二、解释 综合应用代码示例。50以内的乘法算式。 一、代码 <!DOCTYPE html> <html lang"en"> <head><title>20以内的乘法</title><meta charset"UTF-8"><…...
安全先行,合规的内外网文件摆渡要重点关注什么?
内外网隔离在政府、军工部门、科研单位等已成为很常见的网络安全建设措施,内外网隔离是一种网络安全措施,用于保护内部网络免受外部网络的攻击和威胁。 内外网隔离的目的在于限制内外网之间的通信和数据交换,但网络隔离后,仍有数据…...
python:牛客NP9---16进制数字大小
文章目录 一、题意描述输入描述:输出描述: 二、代码1.代码的实现2.读入数据 总结 一、题意 描述 计算的世界,除了二进制与十进制,使用最多的就是十六进制了,现在使用input读入一个十六进制的数字,输出它的…...
【惠友小课堂】你玉米几几呀?关爱青少年骨骼健康,助力“神兽”成长
玉 米 几 几 “你玉米几几呀”这是什么梗?怎么突然火了? 起因是一位来自云南的网友有金记录真实生活,在社交媒体平台上发布了一则视频,视频中字幕“玉米六六”实际上是对“一米六六”身高的一种谐音替换,这种创意表…...
【办公类-21-09】三级育婴师 视频转文字docx(等线小五单倍行距),批量改成“宋体小四、1.5倍行距、蓝色字体”
作品展示: 背景需求: 一、视频处理 1、育婴师培训的现场视频 2、下载视频,将视频换成考题名称 二、音频 视频用格式工厂转成MP3音频 3、转文字doc 把音频放入“网易云见外工作台”转换为“文字" 等待5分钟,音频文字会被写…...
Unity DropDown 组件 详解
Unity版本 2022.3.13f1 Dropdown下拉菜单可以快速创建大量选项 一、 Dropwon属性详解 属性:功能:Interactable此组件是否接受输入?请参阅 Interactable。Transition确定控件以何种方式对用户操作进行可视化响应的属性。请参阅过渡选项。Nav…...
Spring AOP常见面试题
目录 一、对于AOP的理解 二、Spring是如何实现AOP的 1、execution表达式 2、annotation 3、基于Spring API,通过xml配置的方式。 4、基于代理实现 三、Spring AOP的实现原理 四、Spring是如何选择使用哪种动态代理 1、Spring Framework 2、Spring Boot 五…...
Java学习笔记14——常量与变量
曾和儿子分享过所谓计算机程序,都是编写代码进行“数据处理和处理数据”而已。任何编程语言编写何种应用,数据都必须以某种方式表示。掌握变量和常量的用法,可以使代码的可维护性、可读性大大提高。 一、常量 常量就是在程序中固定不变的量…...
代码随想录算法训练营第四十四天 | 卡码网52. 携带研究材料 ,LeetCode 518. 零钱兑换 II , 377. 组合总和 Ⅳ
题目链接:52. 携带研究材料(第七期模拟笔试) (kamacoder.com) #include<bits/stdc.h> using namespace std;int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,v;cin>>n>>v;vector<int> dp(v1,…...
Android Kotlin知识汇总(四)Kotlin 协程实践
Kotlin的重要优势及特点之——结构化并发 Kotlin 协程是一种并发设计模式,可以在 Android 平台上让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。 简单来说,协程就是一种轻量级的非…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
