【HBZ分享】Redis的热点key问题

2023-11-18

Redis是如何将数据落在某个Redis节点上的?

  1. 通过crc16取模(不是hash算法,是校验一种算法)计算该key应该落到哪个hash槽(solt)上,一共16384个hash槽上,这些槽位会均匀分布在每个节点 上(注意:只有主节点才有槽位,子节点没有)。
  2. 当某些高频的key落到同一个redis节点上,导致流量数据倾斜,导致大量的请求会打在某一台节点上,就会造成我们所说的热点key。
  3. 比如【热卖商品】【热点新闻】【热点评论】【大V明星】等场景可能会造成热点key
  4. 什么是热点key:访问量很大的时候才算是热点key,即某个key访问频率很高,比如qps达到1000就需要关注了

如何去发现热点key(Hot key)

  1. 经验处理:通过经验,去预估哪些会称为热点key,提前做处理(可顺便使用,不可做为主要解决方案)
    (1). 优点: 方案简单,凭借经验就可以发现热点key
    (2). 缺点: 没有办法预测所有热点key,比如火爆商品,很难预测所有火爆商品都有哪些

  2. 节点和slot流量监控:每个节点都去流量监控,比如阿里云监控CPU,内存,负载,带宽等参数,是否存在快速上升问题去判断是否出现热点key了。(监测肯定要做的,但复杂场景不能只用这一种方案,需要结合更高级的第三种方案)
    (1). 优点:监控方便,方案简单
    (2). 缺点:粒度太粗,适合前期集群,不适用于精准探测到热点key

  3. 客户端统计:需要客户端二次定制,比如应用程序连接redis需要通过jedis,可以通过程序读取jedis的日志,来进行统计,相当于对数据进行埋点采集,然后把收集的数据上报到统一的计算服务中进行聚合统计(复杂项目要使用,简单项目可以不用。)
    (1). 优点:准确性高,实时性好
    (2). 缺点:需要对SDK工具进行二次开发,开发难度很大,业务链路更复杂

如何解决热点key

  1. 本地缓存:
    (1). 用户只读的信息都放到本地缓存,即从redis读到数据后再保存到本地缓存中,无需可以发现热点key
    (2). 当读取时先读本地缓存,如果有直接返回,如果没有再去redis节点找
    (3). 缺点:本地缓存一份,redis也有一份,那就可能出现短暂的数据不一致的问题,业务如果可以接受那就可以

  2. 离散热点key:
    (1). 将业务key拼接上一个字符串,比如【机器ip】
    (2). 这样做相当于把一份数据冗余到所有redis节点上都有一份,因为不同机器的ip不同,拼接到业务key后整体的key就发生了变化,会计算出不同的hash。
    (3). 热key访问会通过nginx负载请求到不同的后端服务器, 那么这些大量请求由于后端服务器ip不同,会分散到不同的redis节点去查询,因为查询也需要拼接上机器ip,这样同样的数据就会去不同的redis节点查询,不会导致所有请求都冲向一台redis节点。
    (4). 拼接后的key举例:
    product_key_192.168.1.0,
    product_key_192.169.1.1,
    product_key_192.170.10.8

  3. 网关缓存 + 实时计算【推荐复杂项目后期】
    (1). 应用程序的日志打印访问的数据(因为访问应用程序访问redis都会有日志记录), 结合流式计算(flink), 时间窗范围内进行【key访问频率统计】
    (2). 如果统计计算出超过一定频率阈值的热key,比如时间窗内访问增长快,预判会成为热点key,那么就将这个数据放置到业务网关缓存里面,相当于前置热点缓存,客户再访问热点key,就会直接从网关缓存nginx获取, qps可达到10万+,并且无需走后端接口。(nginx可以写lua脚本,就算nginx不存在,lua脚本也可以直接访问redis,无需走后端。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【HBZ分享】Redis的热点key问题 的相关文章

  • 如何统计 Redis 流中未读或已确认的消息?

    使用 Redis 5 0 3 假设我们创建一个名为streamy和一个消费群体consumers XGROUP CREATE streamy consumers MKSTREAM 然后向其中添加一些消息 XADD streamy messa
  • redis-cli 重定向到 127.0.0.1

    我在PC1上启动Redis集群 然后在PC2上连接它 当需要重定向到另一个集群节点时 它会显示Redirected to slot 7785 located at 127 0 0 1 但应该显示Redirected to slot 7785
  • 从redis中检索大数据集

    一台服务器上的应用程序查询另一台服务器上运行的 Redis 查询的结果数据集约为 250kzrangebyscore objects locations inf inf这在应用程序服务器上似乎需要 40 秒 当使用命令执行时redis cl
  • Caffeine Expiry 中如何设置多个过期标准?

    我正在使用 Caffeine v2 8 5 我想创建一个具有可变到期时间的缓存 基于 值的创建 更新以及 该值的最后一次访问 读取 无论先发生什么都应该触发该条目的删除 缓存将成为三层值解析的一部分 The key is present i
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • 为什么Redis中没有有序的hashmap?

    Redis 数据类型 http redis io topics data types包括排序集 http redis io topics data types intro sorted sets以及其他用于键值存储的必要数据结构 但我想知道
  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续
  • Amazon Elasticache Redis 集群 - 无法获取端点

    我需要获取 Amazon Elasticache 中 Redis 集群的终端节点 以下代码适用于 Memcached 集群 但不适用于 Redis import com amazonaws auth AWSCredentials impor
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • 在 Spring 4 中干掉通用的 RedisTemplate

    我读到你可以拥有 Autowired从 Spring 4 开始泛型 这太棒了 我有一个摘要RedisService我想参加的课程 Autowired一个通用的 RestTemplate 如下所示 public abstract class
  • 当 Jedis 与 Spring Data 一起使用时,为什么数据会以奇怪的键存储在 Redis 中?

    我将 Spring Data Redis 与 Jedis 一起使用 我正在尝试存储带有密钥的哈希值vc list id 我能够成功插入到redis 但是 当我使用 redis cli 检查密钥时 我没有看到密钥vc 501381 相反我看到
  • 如何延长 django-redis 中的缓存 ttl(生存时间)?

    我正在使用 django 1 5 4 和 django redis 3 7 1 我想延长缓存的 ttl 生存时间 当我取回它时 这是示例代码 from django core cache import cache foo cache get
  • 超出 Redis 连接/缓冲区大小限制

    在对我们的应用程序服务器进行压力测试时 我们从 Redis 中得到以下异常 ServiceStack Redis RedisException 无法连接到 redis host 6379 处的 redis 实例 gt System Net
  • 由于配置文件错误,无法启动 Redis 服务器

    我刚刚按照此处的说明安装了 Redis http redis io download http redis io download 当我运行 redis server redis conf 时出现以下错误 FATAL CONFIG FILE
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行

随机推荐

  • 华为OD机试 - 单词搜索(Java)

    题目描述 找到它是一个小游戏 你需要在一个矩阵中找到给定的单词 假设给定单词 HELLOWORD 在矩阵中只要能找到 H gt E gt L gt L gt O gt W gt O gt R gt L gt D连成的单词 就算通过 注意区分
  • linux密码过期前警告天数,linux更改用户的密码过期时间

    对于新添加的用户 用户密码过期时间是从 etc login defs中PASS MAX DAYS提取的 普通系统默认就是99999 而安全操作系统4 0是90 更改此处 只是让新建的用户默认密码过期时间变化 已有用户密码过期时间仍然不变 功
  • score在java中_java基础

    DOC执行 set classpath c java Hello 将类的查找路径指向了c盘 在运行时 会从c盘下开始查找 mian 方法是程序的主方法 在一个java程序中有且只能有一个main 方法 main method 之前必须加上p
  • 关于“访问映射网络驱动器提示 本地设备名已在使用中,此连接尚未还原”解决方法!...

    这几天单位2台电脑出现故障 其中一台作为内部部门范围内文件服务器 另外一台电脑连接该机器的共享文件夹 一直正常 就这几天突然出现 访问映射网络驱动器提示 本地设备名已在使用中 此连接尚未还原 的错误 网上查找资料发现一段说明公司客户端的电脑
  • SpringMVC系列(二)之常用注解介绍及参数传递说明

    目录 前言 一 SpringMVC常用注解 1 1 RequestParam 1 2 RequestBody 1 3 PathVariable 1 4 RequestHeader 二 SpringMVC的参数传递 2 1 基础类型传参 可以
  • Java的作用域

    Java的作用域 作用域是指变量能生效的区域范围 声明在不同地方的变量具有不同的作用域 而决定作用域的就是花括号的位置 同时还决定了变量名的可见性与生命周期 Java语言中 变量的类型主要有成员变量 静态变量 和局部变量三种 类的成员变量
  • VS2013编译64位OpenSSL(附32位)

    安装ActivePerl 这个没什么好说的 直接运行msi即可 编译OpenSSL 1 使用Visual Studio Tool中的 VS2013 x64 本机工具命令提示 来打开控制台 也可以打开一个控制台 然后进到 安装路径 Micro
  • OLED拼接屏:打破显示界限,在教育培训中有哪些应用展示?

    早在20世纪初 人们就开始梦想着能够拥有一种透明的屏幕 可以将信息直接显示在空气中 然而 直到现在 这个梦想才真正实现 老透明屏是一种新型的显示技术 它可以将图像和文字直接投射到空气中 使其看起来像是悬浮在空中一样 老透明屏的工作原理是利用
  • [114]python supervisor使用

    Supervisor 是基于 Python 的进程管理工具 只能运行在 Unix Like 的系统上 也就是无法运行在 Windows 上 Supervisor 官方版目前只能运行在 Python 2 4 以上版本 但是还无法运行在 Pyt
  • MQTT在解析一条消息时收不到其他消息

    前提说明 客户端发送两个topic消息 第一个消息依赖第二个消息传入的值 两个topic分别为topic1 topic2 业务说明 topic1消息订阅之后 进行相关业务处理 查库插库等操作 然后轮训redis等待10s redis中存的时
  • 除法取模(比赛常用)

    由费马小定理可推出 其中m为素数 那么 就可以变成 如果m太大 可以使用快速求正整数幂
  • 操作系统系列(二)——进程

    往期地址 操作系统系列一 操作系统概述 本期主题 操作系统进程 文章目录 1 异常 1 前言 异常控制流是什么 2 异常的处理过程 3 异常的分类 4 异常和进程的关系 2 进程 1 进程的概念 2 进程所做的事情 意义 1 逻辑控制流 2
  • Adobe Flash CS6 下载与安装教程

    文章目录 Adobe Flash CS6 简介 一 软件介绍 二 软件特点 三 新增功能 四 安装要求 1 Windows 2 Mac OS 一 Adobe Flash CS6 下载 自取 二 Adobe Flash CS6 安装 Adob
  • QquickWidget与QML交互 ,自定义信号

    在widget加载QML文件 在加载过程中把qml文件添加到资源文件 在Pro文件中添加 QT quickwidgets Qt qml 下面如何qml中的信号连接呢 查看QQuickWidget类 找到了rootObject 方法 这个返回
  • 华为性格测试的破解方法

    几个原则必须要遵守 1 表现出积极进取 乐观向上 不焦虑不紧张的形象 2 华为喜欢那种喜欢艰苦奋斗的人 所以要能吃苦耐劳不计较报酬 3 华为喜欢中庸 不要表现自己的特性 有自己性格可能会被刷掉 4 华为喜欢稳定的 稳定超过一切包括技术 包括
  • 谷歌chromeos_如何安装Chrome OS系统

    Chrome OS是由Google设计的基于Linux内核的操作系统 它源自免费软件Chromium OS 并使用Google Chrome网络浏览器作为其主要用户界面 因此 Chrome操作系统主要支持Web应用程序 谷歌于2009年7月
  • 修改mysql数据库的时区

    查看数据库时区 mysql gt show variables like time zone Variable name Value system time zone EST time zone SYSTEM 2 rows in set 0
  • 阿里弃用Hibernate,却用MyBatis,竟然是因为这个!

    最近一直在研究MyBatis源码 作为国内经常使用的持久层框架 其内部代码的设计非常优秀 比如在开发过程中 有能力对框架进行深度的定制化开发 解决BUG也更加得心应手 另外学习开发者是如何设计高扩展性 低耦合性的代码 便于在自己的开发场景中
  • 66W真的比60W充电更快吗?基于Charge pump Charger的快充方案分析

    智能手机发展至今 充电功率和电池续航一直是人们最为关注的问题之一 从早期的5V 1A和5V 2A的低瓦数快充 到后来的高压大电流和低压小电流两极分化 不同手机厂商都制定了自己的充电协议 如OPPO的VOOC vivo的Flash Charg
  • 【HBZ分享】Redis的热点key问题

    Redis是如何将数据落在某个Redis节点上的 通过crc16取模 不是hash算法 是校验一种算法 计算该key应该落到哪个hash槽 solt 上 一共16384个hash槽上 这些槽位会均匀分布在每个节点 上 注意 只有主节点才有槽