- 博客(35)
- 收藏
- 关注
原创 SaaS短链接(一):什么是SaaS短链接
短链接(Short Link)是指将一个原始的长 URL(Uniform Resource Locator)通过特定的算法或服务转化为一个更短、易于记忆的 URL。短链接通常只包含几个字符,而原始的长 URL 可能会非常长。
2025-02-12 15:15:23
1067
原创 优惠券平台(二十):优惠券平台压测测试
QPS 表示系统每秒能够处理的请求数量,可以理解为系统在一秒内处理了多少个查询(或请求)。常用于描述 接口 或 API 请求 的处理能力,通常与 Web 服务、数据库查询等相关。
2025-02-09 15:24:54
782
原创 优惠券平台(十九):查询用户可用/不可用优惠券&计算折扣金额
本章节通过解析用户的订单信息,实现在订单结算时根据优惠券的不同类型(立减券、满减券、折扣券)进行分类和优惠金额计算。整个过程涉及到 Redis 数据获取、数据分区、消费规则解析和金额计算等多种操作。通过单元测试,我们验证了各种优惠券在不同订单金额和商品组合下的使用规则和优先级。
2025-02-09 11:47:27
1169
原创 优惠券平台(十八):实现锁定/核销/退还优惠券功能
兑换优惠券之后,我们可以在订单结算时使用优惠券,这个时候优惠券状态就会变成锁定中;如果用户支付了订单,优惠券状态变更为已使用;如果订单退款,用户优惠券回退到用户账户里,优惠券状态回退到未使用状态。
2025-02-09 01:05:24
1667
原创 优惠券平台(十七):实现用户查询/取消优惠券预约提醒功能
当用户预约了一个或多个优惠券抢购提醒后,如果不再需要提醒,可以取消预约通知。不过,虽然用户可以取消提醒,但已经发送到 MQ 的消息不会被撤回,消费者在时间点到达时依然会收到消息。此时,我们不应该再向用户发出提醒。因此,我们需要开发一个方法来判断用户是否取消了预约。同时,还需支持用户查询其已预约的优惠券列表信息,以便用户管理其预约状态。
2025-02-08 23:40:37
806
原创 优惠券平台(十六):结合位图实现优惠券预约通知功能
我们采用了位图(bitmap)思想,巧妙地利用单一字段实现了多个时间段的预约提醒功能。通过这种方式,我们不仅满足了海量提醒的需求,还确保了系统的高效和时效性。
2025-02-08 22:39:59
769
原创 优惠券平台(十五):实现兑换/秒杀优惠券功能(2)
上一节中,我们介绍了通过数据库扣减完成用户兑换优惠券的逻辑,这种方式虽然稳妥,但性能有所不足,因为主流程的操作是同步执行的,导致响应时间变长,吞吐量下降。在本章节中,我们通过引入消息队列进行异步解耦,主流程仅同步操作 Redis,后续的数据库耗时操作则交由消息队列消费者来执行,从而提升整体性能。
2025-02-08 13:41:26
953
原创 优惠券平台(十四):实现兑换/秒杀优惠券功能(1)
译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。实现了优惠券的兑换/秒杀功能,并通过canal+mq提升吞吐率,总流程图如下(v1版本的,没有canal)
2025-02-08 13:23:06
1061
原创 优惠券平台(十三):基于注解和Spring AOP环绕通知实现去重表消息防止重复消费
/*** 设置防重令牌 Key 前缀*//*** 通过 SpEL 表达式生成的唯一 Key*//*** 设置防重令牌 Key 过期时间,单位秒,默认 1 小时*//*** 消费中*//*** 已消费*/@Getter/*** 如果消费状态等于消费中,返回失败* @param consumeStatus 消费状态* @return 是否消费失败*/
2025-02-08 01:04:05
3416
原创 优惠券平台(十二):EasyExcel解析实现用户优惠券分发(2)
参考他人的实现方式,这章还是有很大难度的,能把流程图走通实现功能即可,后续再深入学习。
2025-02-08 00:46:51
1056
原创 优惠券平台(十一):布隆过滤器、缓存空值、分布式组合的双重判定锁解决缓存穿透问题
缓存穿透是指由于请求没有办法命中缓存,因此就会直接打到数据库,当请求量较大时,大量的请求就可能会直接把数据库打挂。通常情况下,缓存是为了提高数据访问速度,避免频繁查询数据库。但如果攻击者故意请求缓存中不存在的数据,就会导致缓存不命中,请求直接访问数据库。} else {布隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。它以牺牲一定的准确性为代价,换取了存储空间的极大节省和查询速度的显著提升。具体来说,布隆过滤器包含一个位数组和一组哈希函数。位数组的初始值全部置为 0。
2025-02-07 23:24:30
1074
原创 优惠券平台(十):解决用户查询优惠券缓存击穿
缓存击穿指在高并发的系统中,一个热点数据缓存过期或者在缓存中不存在,导致大量并发请求直接访问数据库,从而给数据库造成巨大压力,甚至可能引起宕机。具体来说,当某个热点数据在缓存中过期时,如果此时有大量并发请求同时访问这个数据,由于缓存中不存在,所有请求都会直接访问数据库,导致数据库负载急剧增加。
2025-02-07 22:54:33
719
原创 优惠券平台(九):开发XXL-Job定时任务执行分发数据
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。注册执行器并在当前执行器下创建定时任务,定时规则cron设置为例如:5s/次,并启动任务,任务会被记录在xxl_job_info表中(已启动的任务表中 trigger_status字段=1;trigger_next_time 是预读时间即任务下一次触发时间。对目标方法(例如推送任务发送到MQ)添加@XxlJob注解,并启动XXL-Job。
2025-02-07 15:23:49
705
原创 优惠券平台(八):线程池和延时队列优化接口响应时间
为了避免复杂直接定义一个内部类RefreshCouponTaskDelayQueueRunner ,实现接口在项目启动后运行后置任务。启动一个线程,在线程无限循环获取 Redis 阻塞队列已经到达时间的元素;然后判断数据库中的分发任务 Excel 总数是否为空,为空读取 Excel 记录,然后设置;如果不为空证明线程池已经运行完了。;) {try {// 获取延迟队列已到达时间元素= null) {
2025-02-07 14:49:08
806
原创 优惠券平台(七):EasyExcel解析百万Excel创建批量分发任务
EasyExcel 是一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成 Excel 的读、写等功能。也是需要先引入maven依赖生成百万行数据基于 Faker 生成示例数据,将示例数据执行 EasyExcel 数据写入流程,最终保存到项目的 /tmp 文件中。/*** 写入优惠券推送示例 Excel 的数据,自行控制即可*/@Testif (!
2025-02-07 14:22:45
809
原创 优惠券平台(六):基于RocketMQ5.x延时消息设置优惠券结束状态
消息队列是一种用于异步通信的机制,允许不同的系统组件或服务之间交换信息。它的主要作用是将消息从发送者传递到接收者,同时解耦这两个组件的直接依赖。高吞吐量和低延迟:RocketMQ 设计用于处理大量的消息,并提供低延迟的消息传递服务,适合需要高性能的场景。分布式架构:RocketMQ 使用分布式架构来支持大规模的消息传递。它可以水平扩展,以处理更大的数据量和更高的并发需求。消息可靠性:RocketMQ 支持消息持久化和多副本机制,确保在系统故障时不会丢失消息。这使得消息的可靠性和一致性得到了保障。
2025-02-06 23:21:13
843
原创 优惠券平台(五):开发优惠券模板结束、增加发行量等功能
数据横向越权是一种安全漏洞类型,指的是在系统中,用户能够访问或操作本不属于他们的数据或资源的行为。比如说,我是商家,然后挺无聊的想刷你数据,我针对单个优惠券重复调用接口进行结束。举个例子:张三创建了一张优惠券,ID 是 Z1,李四知道了这个优惠券 ID,调用停止优惠券接口或者增加发行量接口等使坏。因为数据关系是正常的,我对本店铺的优惠券操作,即使操作一次和操作 N 次的结果都是一样,但是在咱们场景中,思路也很简单以结束优惠券接口举例,我们在代码中验证当前优惠券是否登录用户的店铺,如果不是的话返回异常。
2025-02-06 22:53:07
760
原创 优惠券平台(四):基于注解实现分布式锁防重复提交(2)
通过上一节的代码可以解决我们的优惠券防重复提交(幂等性)问题。虽然业务问题解决了,但是后面的业务逻辑肯定不止这一个场景或资源需要设置分布式锁,能不能实现一个通用组件?
2025-02-06 22:33:56
480
原创 优惠券平台(四):基于注解实现分布式锁防重复提交(1)
分布式锁是一种用于在分布式系统中协调多个节点对共享资源的访问的机制。它确保在多个节点并发访问时,只有一个节点可以在某个时刻拥有特定资源的访问权,从而避免数据不一致、竞争条件或资源冲突的问题。主要是以 Redis 实现的分布式锁为主,其中 Redisson 这个工具包中的分布式锁功能用的较多。@Override// 获取分布式锁标识// 尝试获取锁,获取锁失败就意味着已经重复提交,直接抛出异常if (!throw new ClientException("请勿短时间内重复提交优惠券模板");
2025-02-06 21:49:12
281
原创 优惠券平台(三):引入日志组件记录操作日志
引入 SpringAOP 和 SpEL 概念,通过 mzt-biz-log 框架优雅记录优惠券模板操作日志,并针对优惠券模板记录表进行分库分表操作。系统操作日志是用于记录系统中用户或系统本身所执行的各类操作的日志信息。这些日志通常包括操作的时间、操作的用户、具体操作内容、操作结果以及其他相关信息。安全审计:记录用户操作以防止恶意行为,确保系统的安全性。问题排查:在系统出现问题时,可以通过操作日志快速定位问题来源。结合之前的责任链逻辑,加上操作日志记录后的逻辑图如下: 因为优惠券模板操作日志表会记录模板的创建
2025-02-06 21:16:57
876
原创 优惠券平台(二):设置ShardingSphere对优惠券分库分表
Override// 分片键值,也就是商家店铺编号// 一共有多少个真实的数据库,咱们就两个 ds_0、ds_1// 取模// 通过刚才的数据库下标,获取到数据库逻辑名称 ds_0 或者 ds_1index++;基于哈希取模的方式计算数据库索引,保证数据均匀分布。通过mod选择数据库,确保相同id始终映射到同一个数据库。支持多个数据库,可以扩展到。解决分库分表分布不均问题。
2025-02-06 20:51:39
1011
原创 优惠券平台(一):基于责任链模式创建优惠券模板
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着一个处理链传递,直到链中的某个对象处理它。
2025-02-06 20:26:14
929
原创 2021-08-26
之前有个题目让求路由器接口的ip地址IF1接口ip地址:192.168.1.254使我疑惑的在于为什么要拿192.168.1.253/30这个网络来判断,而不是别的。是因为两个路由器相连要有什么特殊的规定么?理解在这里我们必须清楚的知道,当数据报要跨路由器通过的时候,它真正需要知道的是下一条路由器接口的MAC地址。此时很自然的想到ARP协议,那么路由器R1怎么通过ARP协议的值路由器R2的MAC地址呢?当我看到ARP的广播地址段是子网的广播才恍然大..
2021-08-26 20:41:19
278
原创 正方教务系统爬虫实现
主要库requests,json,re分析网页第一眼就看到网页后缀是.aspx,也就是用的ASP.NET技术,不算老熟人有兴趣可以了解下https://baike.baidu.com/item/aspx/203251?fr=aladdin登录网页称为网页1,随便输入一下账密fiddle抓一下,可以看到网页url,注意是POSThttp://jw.dlust.edu.cn/default2.aspxfiddle 抓登录界面F12 里Radio..
2021-08-22 18:26:57
3596
5
原创 域名流程记录和绑定站点
域名注册流程记录创建信息模板注册域名/购买域名域名备案创建信息模板首先在阿里云里的域名服务中的信息模板中新建域名持有者的信息,填写完整(通信地址填写证件上的地址即可),然后等待认证。10分钟左右,认证成功后,可以多次使用该模板。注册域名/购买域名选择喜欢的域名进行购买购买时选择第一步实名认证的域名持有者,购买成功等待域名的DNS配置状态正常域名备案如果是在阿里云刚注册认证的域名,最好等2天,不然备案一直都是信息不一致。...
2021-03-27 11:10:26
482
原创 公网ip和已备案域名在服务器上搭建tomcat web项目
服务器使用tomcat搭建web项目(公网ip)公网ip公网ip安装tomcat7.0以上,软件管理 -> 安装tomcat7.0以上(极速安装)安装成功后,访问http://公网ip:8080检查连接状态进入宝塔检查tomcat配置文件<Host appBase="/www/server/panel/vhost/tomcat" autoDeploy="true" name="localhost" unpackWARs="true"> <Valve cl
2021-02-05 12:42:05
680
原创 人人美剧迅雷链接多线程和多进程爬虫分析
人人美剧迅雷链接多线程和多进程爬虫分析浅谈GILcpu计算密集型IO密集型普通裸奔多线程多进程+多线程总结浅谈GIL使用python中的多线程就不得不聊聊GIL,基于cpython,当时为python实现多线程时的初衷是为了保证线程的安全性,所以设置了这个全局大锁。GIL无疑就是一把全局排他锁。毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序。但对于特定情况还是有其用武之地。cpu计算密集型计算密集型,顾名思义就是应用需要非常多的CPU计算资源,对变量的计算
2020-12-29 10:24:11
818
2
原创 爬虫关于开启fiddle后Chrome显示网页可能暂时无法连接,或者它已永久性地移动到了新网址
疫情在家没意思经常玩爬虫,fiddle一直在用,开学没怎么动过。有个大数据报告可能需要爬虫,想着把fiddle拾起来,谁知道开启fiddle后网页显示:网页可能暂时无法连接,或者它已永久性地移动到了新网址,心中一颤,当时用fiddle时也有类似的,但那是网页不可访问代理问题,这个完全没见过。回想起最近学的大数据配置了各种东西,因为fiddle的端口是8888,会不会是哪个服务占用了,可那都是服务器上配置的,真的奇怪。想想能在本机上占用端口的服务有突然想起来flask,flask默认5000端口,测试一下
2020-12-02 18:44:25
928
1
原创 sklean案例步骤
(一)选择一个字段作为标准从数据中选择一个字段作为训练和测试的答案例如: Text-to-HTML conversion tool例如wine.csv中的[‘Class’]winequality.csv中的[‘quality’](二)将数据划分为数据、标准两部分从数据中选择一个字段作为训练和测试的答案wine = pd.read_csv('./数据/wine.csv')winequality = pd.read_csv('./数据/winequality.csv')#为w.
2020-11-25 17:25:00
346
原创 数据分析遇到的问题
groupby()df.groupby(["字段名1","字段名2"])该方法将会根据括号内字段名进行分组,返回DataFrameGroupBy类型,输出不了,必须进行聚合操作才能变为DataFrame类型。通常我们也是将groupby()和agg()聚合函数一起使用。data = pd.read_csv('data/ex2data1.txt',names=['exam1','exam2','accept'])suc = data.groupby(['accept'])print(type(suc)
2020-11-25 17:24:24
478
原创 第三章_逻辑回归的多分类问题
逻辑回归的多分类问题——识别手写数字了解.mat文件读取数据划分集合测试图片了解.mat文件.mat文件是属于matlab的文件,具体有什么特点和属性还不知道,但对于本题中我们需要去读取,要用到python中的Scipy库下的loadmat模块吧应该,去读取.mat文件。读取数据划分集合import numpy as npimport matplotlib.pyplot as pltimport scipy.io as siodata = sio.loadmat('data/ex3data1
2020-11-25 17:24:08
883
原创 eclipse配置
开始配置eclipse,从视频的第17分钟开始配置端口号在Windows上解压hadoop,hbase,以及新版本的eclipse配置HADOPP环境变量配置hosts文件UE编辑hosts文件解压w,复制3.0.0下的bin文件,跳过相同文件hadoop.dll文件复制到System32下配置eclipse在eclipse创建第一个Hadoop配置General配置Advanced parameters(4个地方)配置端口号9001,9000,50070,8088,8080,8099CantOS系
2020-11-08 18:24:38
590
原创 吴恩达机器学习第一章作业python实现
吴恩达机器学习第一章作业python实现读取数据数据集准备编写损失函数和梯度下降算法数据可视化读取数据import numpy as npimport pandas as pdimport matplotlib.pyplot as pltdata = pd.read_csv('data/ex1data1.txt',names=['population','profit'])print("数据前5行:",data.head(5))print("数据后5行:",data.tail(5))prin
2020-09-30 14:23:40
935
5
原创 JS中获取元素方法
JS中获取元素方法JS中有很多获取元素的方法Id(id名)TagName(标签名)ClassName(类名)选择器获取第一个元素获取第所有元素JS中有很多获取元素的方法可以通过id,name,class等。Id(id名)document.getElementById()//通过id进行获取<div id="one">hello world!</div>var ...
2020-04-04 16:06:48
2366
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人