【图解秒杀系列】秒杀技术点——多级缓存、分层过滤

【图解秒杀系列】秒杀技术点——多级缓存、分层过滤

  • 多级缓存
    • 本地缓存
    • 分布式缓存
  • 分层过滤

多级缓存

多级缓存在秒杀系统中是非常重要的一个技术点,是应对秒杀场景瞬时高并发读请求的一种有效手段。通过在数据库前面加入多个缓存层,达到过滤掉大多数读请求的效果,有效的对数据库起到保护作用,防止数据库受到大流量的冲击。

在这里插入图片描述

浏览器缓存、CDN、反向代理服务器缓存都在本系列前面的文章中描述过了。

  • 浏览器缓存、CDN: 【图解秒杀系列】秒杀技术点——浏览器缓存、CDN
  • 反向代理服务器缓存:【图解秒杀系列】秒杀技术点——静态化

我们下面说一说本地缓存(一级缓存)和分布式缓存(二级缓存)。

本地缓存

本地缓存就是我们应用程序内部的缓存,可以是JVM(堆内)缓存,也可以是堆外缓存。比如我们可用用一个HashMap缓存商品id与商品详情信息的映射关系。

	Map<Long, ProducetDetailInfo> localCache = new HashMap<>();

这样当服务接收到一个商品详情的查询请求时,假如本地缓存命中,就可以直接返回;如果本地缓存不命中,再去分布式缓存中获取并回写本地缓存;如果分布式缓存也不命中,才去查询DB,然后回写分布式缓存和本地缓存。

在这里插入图片描述

但是,直接用HashMap做本地缓存有一个缺点,就是对于一些冷数据的删除是不方便的,如果不做删除的话该HashMap占用的空间会越来越大,因此我们还要自己维护数据的访问频率或者最近的访问时间,以便于冷数据的删除。

因此,直接使用HashMap做本地缓存是不太推荐的,更推荐的是使用Guava Cache。使用了Guava Cache,只要通过CacheBuilder.maximumSize(long)设置容量大小即可,当超出容量时会使用LRU算法进行回收。

在这里插入图片描述

分布式缓存

分布式缓存是独立部署的缓存服务,是运行在应用程序之外的,需要经过网络通信进行缓存的读写。常用的分布式缓存就是Redis。当本地缓存不命中时,就尝试访问分布式缓存,如果分布式缓存命中了,就回写本地缓存。

在这里插入图片描述

一般而言,我们会把本地缓存的过期时间设置的短一点,而分布式缓存的过期时间设置的较长一点。

在这里插入图片描述

分层过滤

分层过滤是秒杀系统中高效处理高并发请求的策略,分层过滤采用“漏斗”式设计,通过在不同层次上逐步过滤无效请求,确保只有有效请求能够到达系统后端,从而减轻系统压力,提高系统的处理能力和响应速度。

秒杀系统分层过滤中的分层大致可分为以下几层:

在这里插入图片描述

浏览器缓存和CDN作为静态资源的缓存,可以过滤掉大多数静态资源请求,减轻服务器压力,这个在前面的文章已经说过。

反向代理服务器同样也起到静态资源缓存的效果,如果使用OpenResty,还可以通过lua_shared_dict缓存后端返回的商品详情数据,然后通过lua-resty-template进行模板渲染得到商品详情页返回给客户端。这样后续对商品详情页的请求都直接在这一层就可以处理掉,进一步减轻了服务器压力。

在这里插入图片描述

网关作为所有流量的统一入口,负责管理和控制进出网络的流量。它可以提供路由、安全、协议转换等多种功能,确保网络之间的有效通信和数据安全。

在网关这一层,我们可以加入以下过滤功能:

  • 限流:比如限制每秒只放进来1000个请求,多的就抛弃,前端显示“系统繁忙、请稍后再试”。
  • Token校验:在网关层添加秒杀的Token检验,只有携带了Token并检验通过的才可以下单,否则请认定为无效请求。
  • 黑名单防刷:在一段时间内请求超过一定次数的用户,我们就认定它为刷子并记录进黑名单,下次再次请求时则直接拒绝。

在这里插入图片描述

经过了网关之后,请求就会到达我们的服务,此时我们还可以在这里添加一层限流,比如使用Hystrix或者Sentinel之类的流控组件进行限流。

我们在前面的文章提到过,可以添加验证码或者答题机制进行削峰。那么我们的服务检验到验证码不通过,或者答题错误的,就可以拒绝处理该请求,这样就进一步的过滤掉一些无效请求。

在这里插入图片描述

再往下就是我们上面说过的多级缓存:

  • 我们可以在一二级缓存中缓存商品详情数据。
  • 我们可以在缓存中添加一个售罄标志,当该标志位true时,表示秒杀商品已经售空,请求不再往下走。
  • 除此以外,秒杀常常伴随着限购,比如限制每个用户只能买一件或两件。我们可用通过缓存记录用户购买的数量,当超过限购规则限制时,就拒绝用户再下单。

在这里插入图片描述

经过层层过滤,最终剩下的就是有效请求,此时落到数据库的请求数已经很少了。

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

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

相关文章

优惠券秒杀项目

一、添加优惠券的同时&#xff0c;将优惠券信息&#xff0c;以及用户列表放到redis中 Override Transactional public void addSeckillVoucher(Voucher voucher) {// 保存优惠券save(voucher);// 保存秒杀信息SeckillVoucher seckillVoucher new SeckillVoucher();seckillVou…

easyexcel--多sheet页导入导出

多sheet页导出 核心代码就是下图里面的&#xff0c;使用EasyExcel.writeSheet创建一个sheet,然后用excelWriter写入就行了&#xff0c;很简单 GetMapping("downloadMultiSheet")public void downloadMultiSheet(HttpServletResponse response) throws IOException {…

【Qt】输入类控件QDateTimeEdit

目录 输入类控件QDateTimeEdit 例子&#xff1a;实现日期计算器 输入类控件QDateTimeEdit QDate Edit作为日期的微调框 QTime Edit作为时间的微调框 QDateTimeEdit作为时间日期的微调框 下面主要讲解QDateTimeEdit&#xff1a; 核心属性 属性说明 dateTime 时间⽇期的值.…

【Hot100】LeetCode—101. 对称二叉树

目录 1- 思路借助队列 2- 实现⭐101. 对称二叉树——题解思路 3- ACM 实现 原题连接&#xff1a;101. 对称二叉树 1- 思路 借助队列 1- 创建队列&#xff1a;Queue<TreeNode> queue&#xff0c;初始化加入 root.left 和 root.right2- 判断逻辑&#xff1a;while(!queu…

软件开发者的首选:最佳Bug测试工具Top 10

本篇文章介绍了以下软件bug测试管理工具&#xff1a;PingCode、Worktile、Test360、禅道、码云Gitee、优云测试、Jira、GitHub、Axosoft、Bugzilla。 在开发过程中&#xff0c;Bug的管理往往是最让人头疼的问题之一。小问题积累起来不仅会拖延项目进度&#xff0c;还可能影响到…

如何优雅处理异步组件加载:Vue 3 的 Suspense 特性

在日常开发中&#xff0c;我们可能会遇到网络不佳或内容加载时间较长的情况。如果当前页面没有任何内容提示&#xff0c;用户的体验非常糟糕&#xff0c;可能会反复刷新以便加载成功。因此&#xff0c;我们需要给用户提供一个加载中的效果&#xff0c;告知用户“我在努力加载中…

基于单片机的人体健康监测系统的设计

本设计以STM32F103C8T6单片机作为主控&#xff0c;通过MAX30102采集心率、血氧值&#xff0c;通过MSP20血压采集模块检测血压值&#xff0c;通过MLX90614红外体温采集模块检测体温值。OLED屏可以显示以上检测的信息&#xff0c;并可以通过蓝牙模块将信息发送给手机APP。当检测值…

利用VirtualBox安装CentOS系统

博主这次用VirtualBox虚拟机安装CentOS系统。无论是大小型项目都是要发布到云主机上面&#xff0c;必然要用到Linux系统&#xff0c;有的人的本地电脑硬件配置不高&#xff0c;没有办法运行数据库集群&#xff0c;所以只能借助云主机。毕竟云主机也是Linux系统&#xff0c;大家…

大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

OZON什么产品好卖丨OZON婴儿用具产品

Top1 摇铃 Деревянная стойка тренажер Монтессори для мобилей и игрушек для новорожденных / развивающая дуга 商品id&#xff1a;1557614414 月销量&#xff1a;707 OZON婴儿用具…

Leetcode-day31-01背包问题

46. 携带研究材料 1.dp数组代表的是什么&#xff1f; 这里的dp数组是一个二维数组&#xff0c;dp[i][j]是从前i个物品中任选放入容量j内的最大价值。 2.递推公式。 不放物品i&#xff1a;由dp[i - 1][j]推出&#xff0c;即背包容量为j&#xff0c;里面不放物品i的最大价值&am…

uniapp检测手机是否打开定位权限Vue3-直接复制粘贴

安卓示例&#xff1a; 苹果示例&#xff1a; 代码实现&#xff08;vue3写法&#xff09;&#xff1a; const checkGPS ()>{console.log(开始监听GPS状态);let system uni.getSystemInfoSync(); // 获取系统信息if (system.platform android) { // 判断平台var context …

全国上市公司网络安全风险指数(2001-2023年)

数据来源&#xff1a;本数据参考耿勇老师等&#xff08;2024&#xff09;做法采集了2001-2023年的上市公司年报&#xff0c;所有年报均来自于深交所和上交所官方网站&#xff0c;通过对上市公司的年报进行精读&#xff0c;提取出包括网络安全、网络攻击等在内的39个关键词构成企…

牛客笔试小题

目录 牛客.小红取数 牛客.哈夫曼编码​编辑 牛客.字符编码(上一道题的资料) 牛客.最小的完全平方数 牛客.小红取数 01背包问题:在满足总和必须为k的倍数的情况下&#xff0c;选择最大的总和 1.状态表示: dp[i][j]:表示从前面i个数字中挑选&#xff0c;总和%k等于j时候,最大的…

微服务——远程调用

为什么需要远程调用&#xff1f; 在微服务架构中&#xff0c;每个服务都是独立部署和运行的&#xff0c;它们之间需要相互协作以完成复杂的业务逻辑。因此&#xff0c;远程调用成为微服务之间通信的主要方式。通过远程调用&#xff0c;一个服务可以请求另一个服务执行某些操作或…

数学建模国赛获奖技巧

一、团队分工合作的技巧&#xff08;三角形配合&#xff09; &#xff08;1&#xff09;队长要组织多沟通多交流&#xff1b; &#xff08;2&#xff09;建议定期开组会&#xff0c;互相讲授自己学习的东西&#xff0c;一人学习&#xff0c;三人收获。 二、AI辅助思路解析&am…

Eureka 原理与实践全攻略

一、Eureka 概述 Eureka 在微服务架构中具有举足轻重的地位。它作为服务注册与发现的核心组件&#xff0c;为分布式系统中的服务管理提供了关键支持。 Eureka 的主要功能包括服务注册、服务发现、服务健康监测和自我保护机制。服务注册功能使得服务提供者能够在启动时将自身的…

【Unity】移动端草海解决方案

草海是开放大世界渲染的必不可少的因素&#xff0c;Unity 原生的 Terrain 草海效率较低&#xff0c;而且无法与 RVT 结合起来&#xff0c;无法在移动端上实现。因此我们自己搓出来一套草海系统&#xff0c;使用 C# 多线程辅助运算&#xff0c;并能支持割草、烧草等进阶玩法。草…

系统编程 网络 http协议

http协议------应用层的协议 万维网&#xff1a;http解决万维网之间互联互通 计算机web端网络只能看到文字 1.如何在万维网中表示一个资源&#xff1f; url <协议>&#xff1a;//<主机>&#xff1a;<端口>/<路径> ------------------------------…

2024软件测试面试,别玩这些题目,轻松拿捏百分之95的测试!

1、你会封装自动化测试框架吗&#xff1f; 自动化框架主要的核心框架就是分层PO模式&#xff1a;分别为&#xff1a;基础封装层BasePage&#xff0c;PO页面对象层&#xff0c;TestCase测试用例层。然后再加上日志处理模块&#xff0c;ini配置文件读取模块&#xff0c;unittest…