【Redis】热点key问题,的原因和处理,一致性哈希,删除大key的方法

热点 Key 指单个 Key 被高并发访问(如爆款商品),导致 Redis 压力骤增。解决方案应针对 “单个 Key 高并发”:

  • 分片缓存:将热点 Key 分散到不同 Redis 节点(如按一致性哈希算法分片)。
  • 本地缓存:在应用层缓存热点数据(如 Caffeine),减少 Redis 压力。
  • 增加缓存副本:为热点数据增加缓存副本,将热点数据复制到多个缓存节点上,分散访问压力。(例如,使用 Redis 的主从复制,将热点数据储在多个从节点上,分散读请求。)

热点 Key 的产生原因(除 Redis 宕机外)

  • 热点 Key 的核心原因是突发流量或热门事件,例如:
  • 突发活动:秒杀、直播带货导致某个商品 Key 被高频访问。
  • 热点事件:微博热搜话题对应的缓存 Key。
  • 数据倾斜:数据库中某类数据天然访问量高(如高频查询的用户 ID)。

一致性hash了解过吗?

一致性哈希是一种用于分布式系统中的负载均衡算法,它的核心目标是:在节点数量发生变化时,尽量减少数据迁移,同时保持数据的均匀分布。

  • 主要目的是将数据均匀分布到多个节点上,并在节点增减时尽可能减少数据的重新分配
核心原理
  • 哈希环(Hash Ring)

    • 一致性哈希把整个哈希值空间组织成一个环状结构(0 ~ 2³² - 1)。
  • 节点映射

    • 每个节点通过哈希函数(如 FNV、MD5 等)被映射到环上的一个点。
  • 数据映射

    • 数据项(key)同样通过哈希函数映射到环上。
    • 每个数据项存储在顺时针方向遇到的第一个节点上。

节点变动对数据影响最小
  • 增加节点

    • 新节点插入环后,只接管其顺时针方向上第一个节点的部分数据,其余数据不受影响。
  • 删除节点

    • 节点下线后,其数据由顺时针方向的下一个节点接管

这保证了在节点动态增减的情况下,只需迁移小部分数据,极大提升了系统的可扩展性与稳定性。


应用场景
  • 分布式缓存(如 Redis Cluster)
  • 负载均衡(如 Nginx+Consistent Hash)
  • 分布式存储(如 Cassandra、Amazon Dynamo)

删除大key的方式

  1. 分批删除:将大key分批删除,使用SCAN迭代获取大key中的元素逐个删除
HSCAN bigkey 0 COUNT 100
HDEL bigkey f1 f2 f3 ...
  1. 异步删除:利用redis4.0引入的UNLINK代替DEL,在后台进行删除,减少阻塞
UNLINK bigkey
  1. 设置过期时间:为大key设置过期时间,等过期后台自己删除
EXPIRE bigkey 60
  1. 使用lua脚本:使用lua脚本代替发大量操作减少网络IO
-- 分批删除 set 中的成员(每次删100个)
local members = redis.call('SRANDMEMBER', KEYS[1], 100)
for i=1,#members doredis.call('SREM', KEYS[1], members[i])
end
return #members

https://github.com/0voice

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

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

相关文章

通过远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误怎么办?

本文介绍通过远程桌面连接Windows实例提示“出现身份验证错误无法连接到本地安全机构”错误的解决方案。 问题现象 通过本地电脑内的远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误。 问题原因 导致该问题的可能原因如下&#x…

[python] argparse怎么指定bool类型?

前述 最近在写脚本的时候想要实现一个if 操作,通过用户输入。确定要不要启用某个语句。 非常自然的就是使用python的argparse包,但是发现了一个陷阱,记录下。 陷阱 argparse.ArgumentParser() 可以指定输入类型,我可以设定为bo…

Rust 学习笔记:迭代器

Rust 学习笔记:迭代器 Rust 学习笔记:迭代器Iterator trait 和 next 方法使用迭代器的方法生成其他迭代器的方法使用闭包捕获它们的环境 Rust 学习笔记:迭代器 在 Rust 中,迭代器负责遍历每个项的逻辑。迭代器是懒惰的&#xff0…

【深度剖析】义齿定制行业数字化转型模式创新研究(上篇2:痛点和难点分析)

数字化转型正在重塑义齿行业的生态格局,但也面临技术融合与模式变革的深层挑战。当前,义齿定制行业正处于从传统手工制造向全流程数字化制造转型的关键阶段。3D扫描、CAD/CAM(计算机辅助设计与制造)、3D打印等技术的广泛应用,显著提升了义齿制作的精度和效率。传统石膏模型…

window安装nginx

步骤1:下载Nginx for Windows​ 访问Nginx官网下载页面:https://nginx.org/en/download.html 在​​Stable version​​(稳定版)下找到Windows版本,点击下载.zip文件(如 nginx-1.28.0.zip) 步…

气象算法工程师学习路径

目录 🌤️ 气象学与数值预报基础课程🤖 气象人工智能与数据分析课程📘 进阶与实战课程推荐🧭 学习建议与路径规划 如果希望成为一名气象算法工程师,并寻找深入浅出、理论与实践结合的学习资源,以下是为你精…

回调函数的理解

int yuxiangrousi 0; // 全局变量:鱼香肉丝(酱油量)// 回调函数:妈妈处理酱油(将酱油加入鱼香肉丝) void mother_callback(int new_jiangyou) {yuxiangrousi new_jiangyou; // 把酱油放进鱼香肉丝 }// 孩…

多部手机连接同一wifi的ip一样吗?如何更改ip

通常情况下,多部手机连接同一个WiFi时,它们的IP地址是各不相同的(在局域网内)。但是,从互联网(外网)的角度看,它们共享同一个公网IP地址。让我详细解释一下,并说明如何更…

环境温度通过H2A.Zub和H3K27me3动态调控拟南芥细胞命运决定

2025年4月22日,中国科学院遗传与发育生物学研究所肖军研究组在Developmental Cell在线发表了题为Dynamic control of H2A.Zub and H3K27me3 by ambient temperature during cell fate determination in Arabidopsis的研究论文,本研究综合运用ChIP-seq、C…

2024 吉林 CCPC

文章目录 2024 吉林 CCPCL. Recharge(思维、分配)G. Platform Game(模拟)E. Connect Components (排序、思维)D. Parallel Lines 2024 吉林 CCPC 题目链接: Dashboard - The 2024 CCPC National Invitational Contest (Changchun) , The 17…

day13 leetcode-hot100-24(链表3)

234. 回文链表 - 力扣(LeetCode) 1.转化法 思路 将链表转化为列表进行比较 复习到的知识 arraylist的长度函数:list.size() 具体代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode ne…

Vim文本编辑器快捷键用法以及简单介绍

目录 vim文本编辑器 简介: 语法: vim模式介绍: 模式切换: 用法: 编辑模式: 一般模式: 命令模式: vim文本编辑器 简介: 在命令行界面下,最常用的文本…

从 0 到 1:Spring Boot 与 Spring AI 深度实战(基于深度求索 DeepSeek)

在人工智能技术与企业级开发深度融合的今天,传统软件开发模式与 AI 工程化开发的差异日益显著。作为 Spring 生态体系中专注于 AI 工程化的核心框架,Spring AI通过标准化集成方案大幅降低 AI 应用开发门槛。本文将以国产大模型代表 ** 深度求索&#xff…

[Windows] 摸鱼小工具:隐藏软件(重制版)

由吾爱大神写的摸鱼工具: 数据存放路径为C:\Users\用户名\AppData\Local\HideSoft,如果不想用时,删除软件及此路径下的HideSoft文件夹。如添加了开机启动,删除启动菜单文件夹的快捷方式即可,或者删除前在软件中取消设置…

C++ 判断文件的编码类型

大多数文本编辑器,都会在文本文件的头部插入一部分特殊的字节,用于辅助文本编辑器来判断该文件的字符集编码类型。 如:记事本 目前支持的字符集类型,通常为三种: Unicode、UTF8、UnicodeBIG、CP_ACP(默认…

时间序列噪声模型分析软件推荐与使用经验

最近在论文大修2024年投稿的一篇文章,大修了2轮,最后一次还是重新投稿,其中有一个问题一直被审稿人怼,他认为我计算时间序列的趋势的时候,没有考虑时间的相关性,即对噪声模型的估计不合理,会影响…

【redis实战篇】第六天

摘要: 本文介绍了基于Redis的秒杀系统优化方案,主要包含两部分:1)通过Lua脚本校验用户秒杀资格,结合Java异步处理订单提升性能;2)使用Redis Stream实现消息队列处理订单。方案采用Lua脚本保证库…

【Java Web】速通HTML

参考笔记: JavaWeb 速通HTML_java html页面-CSDN博客 目录 一、前言 1.网页组成 1 结构 2 表现 3 行为 2.HTML入门 1 基本介绍 2 基本结构 3. HTML标签 1 基本说明 2 注意事项 4. HTML概念名词解释 二、HTML常用标签汇总 + 案例演示 1. 字体标签 font (1)定义 (2)案例 2…

Oracle/openGauss中,DATE/TIMESTAMP与数字日期/字符日期比较

ORACLE 运行环境 openGauss 运行环境 0、前置知识 ORACLE:DUMP()函数用于返回指定表达式的数据类型、字节长度及内部存储表示的详细信息 SELECT DUMP(123) FROM DUAL; -- Typ2 Len3: 194,2,24 SELECT DUMP(123) FROM DUAL;-- Typ96 Len3: 49,50,51 -- ASCII值&am…

[学习]C++ 模板探讨(代码示例)

C 模板探讨 文章目录 C 模板探讨一、模板基础概念二、函数模板三、类模板1. 类模板的定义与使用2. 成员函数模板3. 类模板的静态成员与继承 四、模板进阶特性1. 非类型模板参数2. 可变参数模板(Variadic Templates)3. 模板元编程(TMP&#xf…