用高并发技巧解决redis热key问题

news2024/11/13 12:52:36

这篇文章我将介绍工作中处理热key问题的常用手段,可能介绍的不是很全,毕竟不同的业务场景可能有不同的解决方案,但是相信通过这部分的介绍能提供一个热key问题的思路。

热key问题,简单来说就是对某一资源的访问量过高问题,再简单一点来说就是对某个资源访问的qps过高,而解决访问量高的问题通常我们使用分布式缓存,最常见的就是redis,这个资源对应redis的一个key简称热key。热key在开发中是非常常见的,比如各种app的榜单,活动页面上的一些资源。

虽然redis号称单节点能扛住10Wqps,但是开发中肯定不能这样去估计,毕竟安全第一,比如5000似乎就可能就可以作为上限。如果超过5000该怎么处理呢?下面将提供几种常见的解决方案。

冗余写/随机读

假设在做活动,活动总金额为amount,用户每次完成任务会得到一笔奖金,每天结算一次,在页面会展示剩余金额restAmount。我们将剩余金额存到redis中,{key: pool, value: restAmount}

由于每天统一结算,所以写的qps不会很高,毕竟我们能自己控制流量,比如用户完成后发个延迟结算消息到mq,然后由消费者来处理计算剩余金额最后更新到redis中。

但是在页面的读的qps是很高的。显然奖池pool就是个热key。

既然单节点扛不住,那么显然可以将数据写到N个节点上,也就是将奖池存到多个节点,在页面读取的时候随机选一个节点去读。假如有10W的qps,N=10,那么每个节点的流量就成了1W的qps。

大key问题与分shard处理

上面介绍的奖池问题显然不是大key问题,工作中常见的大key问题通常涉及到批量用户存储在set或者map中。举个不恰当的例子(之所以说不恰当是因为大量数据判存完全可以使用布隆过滤器)。假如同时存在若干个活动,对于每个活动,如果用户完成了,需要记录下用户完成情况,在后续页面进行对应的完成情况展示。这里可以使用map来处理,{key:activityId, value:{field:userId, value:完成情况}}

那么这显然是一个大key问题,同时也是个热点问题。但是用上面介绍的办法能解决热key问题,解决不了大key问题。

解决这个问题其实也可以采用分而治之的思路,就是将大key拆分为若干小key,并且尽量让若干小key存在不同的redis节点中。

比如对于一个活动id我可以分为10个shard,{shard_1,...,shard_10},使用userId%10得到归属的shard。

这样每次判断取出用户完成情况,就先找到对应活动的shard然后拿出该用户即可。如果要拿出活动下的所有用户来做榜单,则只需要将所有shard都拿出来排序即可;

由于不同的shard在不同的redis节点,这样就又解决了热点问题。

本地缓存

如果条件允许的话,也就是本地缓存够用,或者说数据量不是很大,同时能够接受一定的延迟的话,那么可以直接使用本地缓存。这里就以guava的LoadingCache为例。

以奖池的例子来说,数据量小的忽略不计,因为结算时同一结算并更新奖池,也就是说一天中23个多小时数据都不会变,变动的时间也很短,所以我们可以接受一定的延迟,只要记得讲本地缓存过期时间设置短一点,比如10分钟。

此外需要有个地方供过期后的本地缓存读取,可以使用db或者redis,这样每次更新数据的时候就得更新db或者redis。为了防止击穿,记得使用load-miss方法。

LoadingCache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(1000L) .expireAfterAccess(Duration.ofSeconds(600L)) .expireAfterWrite(Duration.ofSeconds(600L)) .build(new CacheLoader<String, String>() { @Override public String load(String key) throws Exception { // load from db } }); String restAmount = cache.get("pool"); 复制代码

使用Memcached

这在公司基础架构用的会更多一点,为什么可以使用memcached,看下面两段话的介绍就知道了.

  1. Redis是单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题;性能受限于CPU,单实例QPS在4-6w。Memcached是多线程,可以利用多核优势,单实例在正常情况下,可以达到写入60-80w qps,读80-100w qps。

  2. Redis的big key与热key类操作,如果qps较高则容易造成redis阻塞,影响整体请求。Memcached因为是多线程,与redis相比,在big key与热key类操作上支持较好。

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

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

相关文章

Unity学习shader笔记[一百零八]简单萤火效果

之前用粒子系统基于原有萤火虫的粒子改了一波慢萤火效果就被惊艳到了&#xff0c;开始大家讨论&#xff0c;就都觉得这样大数量的粒子消耗挺大的&#xff0c;后面测试过才发现单纯的粒子系统在总粒子数量3000&#xff0c;每秒300的生成数量&#xff0c;屏幕呈现有1000多个粒子的…

【黄啊码】MySQL入门—17、在没有备份的情况下,如何恢复数据库数据?

大家好&#xff01;我是黄啊码&#xff0c;MySQL的入门篇已经讲到第16个课程了&#xff0c;今天我们继续讲讲大白篇系列——科技与狠活之恢复数据库 在没做数据库备份&#xff0c;没有开启使用 Binlog 的情况下&#xff0c;尽可能地找回数据。 今天的内容主要包括以下几个部分…

2022NISCTF--web

easyssrf 打开题目&#xff0c;显示的是 尝试输入&#xff0c; 发现输入flag有东西 读取文件 访问下一个网站 读取文件 不能以file开头 直接伪协议&#xff0c;base64解码 checkIn 奇怪的unicode编码 当选中左边的时候右边也会被选中 我们在vscode看看 这样的额 展示的是UTF-1…

Linux系统中利用open函数多次打开同一个文件操作方法

大家好。 今天的话主要和大家聊一聊&#xff0c;在Linux系统中如果一个文件被打开多次会出现什么情况。 目录 第一&#xff1a;多次打开同一个文件 ​第二&#xff1a;一个文件被打开多次&#xff0c;在内存中不会存在多份动态文件 ​第三&#xff1a;多次open打开同一…

第一章 - Windows安装VMware Workstation Pro

文章目录前言一、VMware Workstation Pro安装的前提条件二、VMware Workstation Pro下载三、VMware Workstation Pro安装前言 Linux是一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发已经得到业界认可&#xff0c;目前很多企业级的项目都会部署到Linux系统…

结构体内存对齐

在知道了结构体类型的基本使用之后&#xff0c;我们需要深入探讨一个问题&#xff0c;即计算结构体的大小&#xff0c;这也是一个热门的考点&#xff1a;结构体内存对齐。 目录 一、结构体的对齐规则 二、例题 2.1 例题一 2.2 例题二 2.3 例题三 ​编辑 三、为什么存在内存…

【C++】vector,list迭代器失效

1.vector迭代器失效 vector容器的物理基础是线性表&#xff0c;底层是指针变量实现的。 在这里导致vector迭代器失效的原因会有两种-----插入失效&#xff0c;删除失效。 1.2插入数值导致迭代器失效 1.21扩容导致迭代器失效 我们在一块vector空间插入pos&#xff08;20&…

第三章 单向链表的讲解与实现

初阶数据结构 第一章 时间复杂度和空间复杂度 第二章 动态顺序表的实现 第三章 单向链表的讲解与实现 文章目录初阶数据结构前言一、什么是链表&#xff1f;二、节点的定义&#xff1a;三、单向链表接口函数1、打印&#xff1a;2、尾插&#xff1a;3、头插&#xff1a;4、尾删…

改进YOLOv7系列: 最新结合用于小目标的新CNN卷积构建块

&#x1f4a1;统一使用 YOLOv7 代码框架&#xff0c;结合不同模块来构建不同的YOLO目标检测模型。&#x1f31f;本项目包含大量的改进方式,降低改进难度,改进点包含【Backbone特征主干】、【Neck特征融合】、【Head检测头】、【注意力机制】、【IoU损失函数】、【NMS】、【Loss…

Linux-进程控制

进程控制进程创建fork函数写时拷贝fork常规用法fork调用失败的原因进程终止进程等待进程程序替换程序替换的原理如何程序替换进程创建 fork函数 fork之前父进程独立运行&#xff0c;fork之后&#xff0c;父子两个执行流分别执行。 进程具有独立性&#xff0c;代码和数据必须独立…

机器学习HMM模型

目录1 马尔科夫链1.1 简介1.2 经典举例1.3 小结2 HMM简介2.1 简单案例2.2 案例进阶2.2.1 问题阐述2.2.2 问题解决3 HMM模型基础3.1 什么样的问题需要HMM模型3.2 HMM模型的定义3.3 一个HMM模型实例3.4 HMM观测序列的生成3.5 HMM模型的三个基本问题4 前向后向算法评估观察序列概率…

计算机毕业设计-SSM高校社团招新系统-JavaWeb大学生社团管理系统-源码+文档+讲解

注意&#xff1a;该项目只展示部分功能&#xff0c;如需了解&#xff0c;评论区咨询即可。 本文目录1.开发环境2.系统的设计背景3 前后台功能设计3.1 前台功能3.2 后台功能4 系统页面展示4.1 学生功能模块展示4.2 干部功能模块展示4.3 管理员功能模块展示5 更多推荐6 部分功能代…

如何用IDEA提高你的开发效率

前言 ​ 作为一名java开发工程师&#xff0c;IDEA无疑是我日常接触最多的工具。因此&#xff0c;能否高效使用IDEA软件&#xff0c;一定程度上决定了我们的开发效率。本文将主要介绍IDEA中的四个便于提高开发效率的功能&#xff0c;常用快捷键、实时模版、后缀补全、文件和代码…

《本地计算机DNS缓存文件》

C:\Windows\System32\drivers\etc 36.152.44.95 www.baidu.com 正常访问www.baidu.com可以DNS抓包&#xff0c;将百度的IP及域名加入文件位置的hosts文件中即该IP和域名将不再请求网络上的DNS服务器&#xff0c;即加快域名解析&#xff1b; 具体作用&#xff1a; 1.加快域名解…

什么是RPC框架?

什么是RPC&#xff1f; In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it wer…

创新能力 | 产品经理实践中常犯的七大错误

做产品是一个既感性又理性的过程&#xff0c;纵然有很多前辈同行的经验传承和技巧指导&#xff0c;但在落到实处是时&#xff0c;总难免犯一些错误。有些是经验不足导致&#xff0c;有些则是产品经理对于人性的浅见寡闻。本文作为产品经理实践指南专题的中级篇&#xff0c;阐述…

用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (2)-走马灯

AWPLC 目前还处于开发阶段的早期&#xff0c;写这个系列文章的目的&#xff0c;除了用来验证目前所做的工作外&#xff0c;还希望得到大家的指点和反馈。如果您有任何疑问和建议&#xff0c;请在评论区留言。 1. 背景 AWTK 全称 Toolkit AnyWhere&#xff0c;是 ZLG 开发的开源…

全球名校AI课程库(35)| 辛辛那提大学 · 微积分Ⅱ课程『MATH101 Calculus II』

&#x1f3c6; 课程学习中心 | &#x1f6a7; CS数学基础课程合辑 | &#x1f30d; 课程主页 | &#x1f4fa; 中英字幕视频 | &#x1f680; 项目代码解析 课程介绍 Trefor Bazett 教授在 Cincinnati 大学任教时&#xff0c;制作了两套完整的的数学课程&#xff08;微积分、离…

Eclipse创建Servlet项目-7

目录 1、创建动态 Web 项目 2、使用 Eclipse 创建 Servlet 3、配置 web.xml 4、部署项目并启动服务器 通过前面的学习&#xff0c;我们了解了如何在 Tomcat 目录下手动部署 Servlet&#xff0c;这种方式不但效率低下&#xff0c;而且容易出错。因此&#xff0c;在实际开发中…

变量常量,基本数据类型及数据类型转换

⭐️ 变量常量与基本数据类型及数据类型转换 &#x1f4cd; 来自&#xff1a;中南林业科技大学软件协会学术部&#xff1a;谢添 ⏲ 时间&#xff1a;2022 - 10 - 29 至 2022 - 10 - 30 &#x1f3e0; 官网&#xff1a;https://www.csuftsap.cn/ ✏️ 本章所有提供代码均已测…