【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从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • 在 Redis 上为 Django 和 Express.js 应用程序共享会话存储

    我想创建一个包含一些登录用户的 Django 应用程序 另一方面 由于我想要一些实时功能 所以我想使用 Express js 应用程序 现在的问题是 我不希望身份不明的用户访问 Express js 应用程序的日期 因此 我必须在 Expr
  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • docker-compose:容器之间的 Redis 连接被拒绝

    我正在尝试设置一个 docker compose 文件 该文件旨在替换运行多个进程 RQ 工作线程 RQ 仪表板和 Flask 应用程序 的单个 Docker 容器解决方案导师 http supervisord org 主机系统是 Debi
  • 如何延长 django-redis 中的缓存 ttl(生存时间)?

    我正在使用 django 1 5 4 和 django redis 3 7 1 我想延长缓存的 ttl 生存时间 当我取回它时 这是示例代码 from django core cache import cache foo cache get
  • ServiceStack.Redis:无法连接:sPort:

    我经常得到 ServiceStack Redis 无法连接 sPort 0 或 ServiceStack Redis 无法连接 sPort 50071 或其他端口号 当我们的网站比较繁忙时 就会出现这种情况 Redis 本身看起来很好 CP
  • 使用环境变量在 redis.conf 中设置动态路径

    我有一个环境变量MY HOME其中有一个目录的路径 home abc 现在 我有一个redis conf文件 我需要像这样设置这个路径 redis conf pidfile MY HOME local var pids redis pid
  • Redis 中存储整数和字符串的区别

    这两个命令有什么区别吗 LPUSH myset 123 LPUSH myset 123 我想存储大约 500 万个整数 并且我想以最有效的方式做到这一点 不 没有什么区别 两者都存储为字符串 从redis io http redis io
  • Redis 在键过期时更新排序集

    我有一个 Redis 服务器 其中包含一组键值对和一个排序集 提供这些键值对的键的索引 键值对可以进入 已完成 状态 此时需要在 1 小时后删除它们 这可以通过在键上设置到期时间来简单地实现 但从排序集中清除它们似乎更成问题 我可以有一个过
  • 如何在Redis中正确存储图片?

    决定将图像存储在Redis中 如何正确执行 现在我这样做 redis gt set image path here is the base64 image code 我不确定这是否正常 将图片存储在Redis中是完全可以的 Redis 键和
  • 使用 Redis 中的键

    我是 Redis 和键值数据库的新手 你能告诉我如何在redis中正确实现这种关系方法吗 我有一个关系表 其中两个键对应一个值 master id slave id 价值 Example 主站 ID 从属ID 价值 1 1 值1 2 1 值
  • 批量将Dictionary中的数据设置到Redis中

    我正在使用 StackExchange Redis DB 插入键值对字典Batch如下 private static StackExchange Redis IDatabase database public void SetAll
  • 具有匹配模式的 ioredis 密钥

    我想用键匹配模式 LOGIN 搜索 Redis 数据库 我在我的应用程序中使用 ioredis 昨天我搜索了整个网络 我得到了一些执行这项工作的选项 如下所示 KEYS 扫描流 Issue import Redis from ioredis

随机推荐

  • 华为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槽上 这些槽位会均匀分布在每个节点 上 注意 只有主节点才有槽