技术分享 | MySQL 改表工单后台逻辑实现

使用状态机模式重构复杂工单流转逻辑 本文探讨了电信网络运维(OSS)系统中工单管理系统的优化方案。针对传统工单系统存在状态判断逻辑分散、扩展困难等问题,提出基于Spring StateMachine或Cola-StateMachine框架的解决方案。通过定义状态、事件和动作,实现业务逻辑解耦和自动校验,结合Redis持久化和WebSocket实时推送,构建高内聚、低耦合的工单流转引擎。文章详细介绍了状态机配置、上下文数据传递、服务层调用等核心实现,以及利用Redis ZSet实现工单超时预警的进阶特性。该方案有效提升了代码可维护性,支持动态调 阅读详情

作者:莫善

某互联网公司高级 DBA。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文目录

一、导读

二、背景

三、分析

四、正文

五、写在最后

一、导读

DBA【MySQL DBA】,其他 DBA 不在本文讨论范围。

DDL【ALTER TABLE】,其他操作不在本文讨论范围。

OMM【Only Modifies Metadata】。

NOMM【Not Only Modifies Metadata】。

二、背景

嘟!嘟!嘟!

你好,我今晚要上线新功能,有个改表帮我处理一下呗。

你好,我有个亿级(十亿)表,需要加个字段/索引帮我处理一下呗。

你好,我刚加了一个字段,小表半小时还没加完,而且现在好像写不了数据。

DBA 们应该经常会接到这种需求吧。

DDL 操作可能是 DBA 最头疼的一项工作之一,也是最日常的一项工作了。动不动就要加个字段,扩个长度。如果不幸前期设计不合理的系统,那后期维护起来就真的是叫爹骂娘的问候。如果又不幸是接盘跑了八百年的业务表需要上线新功能加一两字段或者扩个长度啥的,简直酸爽到飞。

MySQLL 5.6 开始支持 OnlineDDL,美美地敲了回车,等半天还是没反应,撸了一把又一把,业务催了一遍又一遍,猥琐发育都二胎了,就是没结束,在三胎之后终于跑完了,然后你就躺下刷了会手机,想找点安慰告别努力工作的一天,结果发现又是绿油油的一天,怒扔手机睡觉去了,不曾想刚酝酿了一会睡意,麻烦又来了。

业务疯狂的打电话,很不情愿的接通了。业务反馈很多订单返回的数据都有问题。机智的你猜到了肯定是改表导致了延迟,业务还是一顿吐槽,吧啦吧啦说一大堆,还得起来把读流量切到主库,有没有很酸爽。

为啥会这样呢,我们就来掰扯掰扯这个问题。

MySQL 的 DDL 操作主要有两种方式 copy 和 inplace。copy 表需要全程锁表,对业务影响极大,inplace 不阻塞 dml 操作。但是 MySQL 5.6 推出 OnlineDDL 以前,基本干啥 copy,干啥啥不行,干啥啥锁表。5.6 版本推出 OnlineDDL,DBA 们简直爱的不要不要了。但是 inplace?就真的很爱了吗。别忘了,inplace 分为 rebuild 和 no-rebuild,这就能解释了为啥很多操作还是很慢了。原因就是:【Not Only Modifies Metadata】。

既然 OnlineDDL 还是有那么多问题,那我们该咋整呢?这还只是一个 DDL 操作,如果很多呢,几十上百个 DDL 需求,是不是要疯,枸杞红枣肾宝片是不是得搞起来了。但是别慌,还有后招。生活是很美好的,比如骑上小电驴就可以送外卖了。

废话时间结束,现在言归正传,来聊聊改表工单系统-后台逻辑是怎么实现的。

三、分析

**为什么 DBA 那么排斥 DDL 操作? **

1)对生产环境的敬畏心,能不做就不做,多做多错。只要是对线上环境操作,就是有风险的,一定要有这个意识,任何认为简单的操作都可能隐藏着不可预知的风险,线上环境无小事,一出事就是大事。所以能避免人为操作,就尽量避免人为操作。(是自动化不香吗,还是工作不饱和要体现工作量)

2)大表 DDL 操作成本高,白天容易影响业务,产生延迟等等。一般都是凌晨搞,熬夜太伤肾。还有就是,大多数 DDL 开销成本极大,简单来说就是【Not Only Modifies Metadata】开销成本都不小,那么就会带来一些问题,比如上面提到的延迟,还有就是 mdl 锁问题,还有磁盘 io 争抢,磁盘空间爆满等等,所以是有诸多风险的。
是否是【Only Modifies Metadata】请参照下表:

Operation5.65.78.0
Dropping an indexYESYESYES
Renaming an indexNULLYESYES
Changing the index typeYESYESYES
Renaming a columnYESYESYES
Setting a column default valueYESYESYES
Extending VARCHAR column sizeNOYESYES
Dropping the column default valueYESYESYES
Modifying the definition of an ENUM or SET columnYESYESYES
Adding a VIRTUAL columnNULLYESYES
Dropping a VIRTUAL columnNULLYESYES
Adding a foreign key constraintYESYESYES
Dropping a foreign key constraintYESYESYES
Setting persistent table statisticsYESYESYES
Renaming a tableYESYESYES

注:8.0 支持快速加列(instant 算法),但是有很多限制。常见的就是(1)不能使用 after、first 等位置属性,只能添加在表的最后一列。(2)不能是开启压缩的表。(3)不能是有全文索引的表。

3)重复性工作,大部分就是一个回车的事,然后就是盯监控,关注告警等一小时甚至更久,问题是每天还重复干很多。(dba 是干大事的,想想当时是不是按照内核开发要求招你来的)。

当然,在日常工作中,DBA 处理 DDL 操作,一般都是使用 gh-ost 或者 pt-osc 来进行操作,但是这两款工具就没问题了吗?下面我列几个问题:

  1. pt-osc,有触发器限制,产生死锁,且触发概率明显比 ghost 高很多。这是一个风险点,很容易被忽略。当 pt-osc 异常退出的时候,触发器还是会留在表上,这时候如果先删除临时表(xx_new)而没有先删除触发器,那一定很酸爽,业务一定会把你电话打爆。

  2. gh-ost,对网络要求比较高,如果网络延迟比较严重可能会导致改表一直不会完成。对 binlog format 要求是 row,binlog image 要求是 full。还有不支持外键表。

  3. 最重要的一个问题,这类工具都比较笨,只会 copy 数据。就是说即便是【Only Modifies Metadata】也会傻傻的 copy。对于大表,或者 TPS 比较大的业务,会写很多 binlog,容易将磁盘打爆。

  4. 对于有慢查询环境,还是容易出现 mdl 等待。gh-ost 稍微好点,但是 pt-osc 的话就比较爽了,会一直锁。直到人为干预。

综上,会发现,DDL 真的很烦人,实际工作中遇到的痛点估计比上述的更多。(在此也建议业务,前期一定要做好数据库设计,有条件的一定要让 dba 参与设计,没有条件的一定要创建条件)

四、正文

先上一个流程图:

提示:原图链接

https://gitee.com/mo-shan/myonlineddl/blob/master/img/myonlineddl.png

主要做如下几点介绍:

  1. 格式化 SQL,需要将业务 SQL 做统一格式化处理,方便后面做 SQL 解析。

  2. 第一次 SQL 解析。根据用户提交的 DDL 做预定义用法判断,检查所有操作是否是满足预定义的。这块逻辑就是把控工单的操作,做到所有操作都可控。啥能做,啥不能做。

  3. 第二次 SQL 解析。判断单条 DDL 是否满足【Only Modifies Metadata】如果满足就直接 OnlineDDL 了,如果不满足就使用 ghost/ptosc 工具。选择工具的时候会针对上述的优缺点问题做各自的判断,然后优先选择 ghost。说白了就是工单自适应,可根据当前操作,及不同环境做出判断,并调整相应配置生成一个安全合理又高效的执行计划。

  4. 提供 DDL 审核功能,并不是说业务提交什么就都能通过。比如说,是否允许 null 值,是否要求有注释,是否要求规范索引名等等。都可以通过规则开关进行审核。(这点跟上述得预定义用法判断有区别,一个是限制操作,一个是控制操作是否规范合理)

  5. 加上监控,和对异常处理。比如对 mdl 的监控,连接数,活跃连接数,磁盘空间等等,触发告警会有邮件提示。

  6. 尽可能的保证每个工单的原子性。就是尽可能的保证每个工单里的每条 DDL 都成功。要么就都不做,要做就都要成功,需要注意,这里说的是尽可能,有点耐人寻味。

  7. 通过 API 去实现动态配置改表工单,比如正在执行的改表需要暂停,恢复,终止,又或者需要获取改表进度。

  8. 扫尾工作。这点没什么好说的,擦干屁股很重要,避免下次踩坑。

当然要实现上述功能,最大的难度就是如何对业务的 DDL 操作进行解析。只有实现了 SQL 解析,才能消除上痛点实现功能。大家也可以想想怎么实现 SQL 解析这个功能。

下面列几个我在实现的时候遇到问题,供大家思考一下:

  1. SQL 格式化的时候,注释会对你的实现会产生很大的阻碍,那么该如何处理注释的呢。( “/* */ comment ‘’ # --”等等这些注释 )

  2. SQL 解析的时候要考虑【Only Modifies Metadata】分 change、modify,varchar 扩长度(又有局限性)等场景。如何鉴定这些是否满足【OMM】,如果是 modify 的组合模式(modify varchar and not varchar)又该怎么鉴定。

  3. 如何鉴定是否满足 8.0 的快速加列。

  4. SQL 审核的功能,如何把控 DDL 操作是合理的。

  5. 保留字问题怎么处理呢?不处理,直接返回错误?那用户体验太差了。有些人可能就会说,用反引号引起来就好了,那么问题来了,用户不知道这是关键字,他写的 SQL 没有用反引号,那需要工单系统二次处理给加上,那应该怎么加呢?哪些需要加呢?

以上几点,大家可以想想怎么实现,可能用脑子一过觉得难度好像不大,但是真正落实到代码,应该还是有些难度的。毕竟 ALTER TABLE 语法千变万化,组合十分复杂,关于我是如何实现的,有兴趣的小伙伴可以看一下 git,欢迎吐槽改进。(安装部署及测试都有)

git:https://gitee.com/mo-shan/myonlineddl

需要了解测试流程,可以直接阅读【README.md】测试部分

五、写在最后

日拱一卒,终有一日成车。就是干!

最新thinkphp工单系统 最新thinkphp工单系统,是基于thinkphp开发的,php+MySQL 立即下载

相关推荐

WinFrom真入门(1)——Windows窗体应用概念

用Winform开发的桌面程序,是在Windows操作系统上运行的,这个不用多说。窗体(Form)的作用‌:窗体是用户交互的容器,承载按钮、文本框等控件,构成应用程序的界面‌。在Windows操作系统中,窗体(窗口)所处可见,例如: 一个标准的窗体其实就是一块矩形区域,客户区域指的是窗口内部区域。除去标题兰和边框外的区域可视为内部区域,称为客户区域。我们开发人员可以在窗口的客户区域中放置控件,也可以在其中绘制出咱们所需要的图形。WinForm程序的项目的结构,如下图: Main()方法是程序的入口,这几行代

ByteGeek 1635

工单系统——深度解析高效的功能架构(中)

前言本文继续阐述工单系统-高效的功能架构,中篇的5个支撑性的模块分别为:工单管理、工单工作台、工单时效、工单通知、工单监控,主要解决的是工单系统的使用体验是否足够好的问题。工单系统在体验上的优化大部分优化以及小部分在效率上的优化会通过这五个功能模块来完成。同时这五个功能模块的设计理念也紧密围绕高效协同和灵活适配,在这五个模块中仍然能够看到大量为了更高效、更灵活做出的功能架构设计。一、工单管理工单管...

qianshanding0708的博客 3026

时序约束实战:从setup/hold到时钟路径约束的深度解析

本文深度解析数字设计中的时序约束实战,重点探讨如何从setup/hold检查的核心原理出发,理解并应用时钟路径约束。文章通过剖析Path Requirement的计算逻辑,结合同频、倍频及异步时钟域等典型场景,提供了从解读时序报告到编写、调试SDC约束的系统方法,帮助工程师有效应对复杂SoC设计中的时序收敛挑战。

weixin_29291185的博客 105

工作订单生命流程

Field Service--工作订单--生命周期

Abel_01_xu的博客 1070

ST7789P3初始化配置

【代码】ST7789P3初始化配置。

zqq_1314的博客 4155

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

XiaoqiangClub的博客 7190

工单系统架构设计

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

weixin_42429106的博客 4705

uv pip install时出现error: Request failed after 3 retries 解决方案

本文主要介绍了uv pip install时出现error: Request failed after 3 retries解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方法一 2.2 方法二

weixin_43178406的博客 12万+

Mysql - 为什么表数据删掉一半,表文件大小不变?

Mysql - 为什么表数据删掉一半,表文件大小不变? 一:概念 这里,我们还是针对 MySQL 中应用最广泛的 InnoDB 引擎展开讨论。 一个 InnoDB 表包含两部分,即:表结构定义和数据。 在 MySQL 8.0 版本以前,表结构是存在以.frm 为后缀的文件里。 而 MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。 因为表结构定义占用的空间很小...

qq_39309096的博客 636

Pytorch图像去噪实战(七):Noise2Noise自监督图像去噪实战,没有干净图也能训练模型

PyTorch图像去噪实战:Noise2Noise自监督去噪方法 本文介绍了在没有干净图像的情况下使用Noise2Noise方法进行图像去噪的实战方案。主要内容包括: 问题场景:真实项目中经常只有带噪图像而没有对应的干净图像,如夜间监控、医学影像等场景。 Noise2Noise核心思想:使用同一场景的两张不同噪声版本的图像进行训练(noisy_image_a → noisy_image_b),让模型学习恢复共同的干净结构而非随机噪声。 技术原理:模型通过最小化两个独立噪声图像之间的差异,最终会收敛到真实干净

ai技术增长的博客 502

C#版OpenCV:OpenCVSharp 最详细最全面教程(万字详细总结)

OpenCVSharp 是一个用于 .NET 环境的 OpenCV 包装库,它提供了一种简便的方法来利用 OpenCV 的功能进行图像和视频处理。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉和机器学习软件库,最初由 Intel 研发并发布。OpenCVSharp 让 C# 和其他 .NET 语言的开发者可以方便地访问 OpenCV 的强大功能。// 打印 OpenCV 版本信息Cv2。

仰望星空的博客 2万+

字段长度扩容大冒险:MySQL的Inplace与Copy之辩

算法,也就是创建临时表,把数据copy过去,最后交换名字,删除旧表。如果要修改的表是张大表的话,肯定要花费很久的时间,虽然MDL加锁时间很短,并不会影响该表正常读写,但是如果涉及主从架构的话,产生主从延迟是不可避免的了。毕竟在这个数据决定一切的时代,一个小小的字段变更,都可能引发连锁反应,影响无垠。这时候,糟糕的开发同学又急匆匆地跑来了,说刚才字段长度说错了,其实计划修改为。,他们坚持现行的做法,就地修改字段长度,免去了数据挪移的麻烦。这条修行之路虽然漫长,但对于数据库从业者来说,一定是充满乐趣和挑战的。

qq_39430356的博客 2009

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

转转高效改表平台的演进之路

转转的改表平台系统拥有,用户交互,添加唯一索引,支持分库分表,丰富的监控,止血及部分治愈能力。可以定时改表,也可以支持快速改表。

zhuanzhuantech的博客 1493

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

原来 pt-osc 改表是这样实现的!原理详解【附场景案例】

经过上面的梳理分析,我们知道pt-osc在改表过程中做了很多事情,现在我们做个简单的总结,主要是想梳理一下这个工具的缺点,毕竟使用这个工具的朋友应该都知道这工具很优秀,很好用。但是往往缺点容易被忽视,希望能帮大家提供一些思路以及规避一些问题。可能出现死锁,这个问题上面也分析了,这里就不过多介绍了。触发器会导致业务的dml流量翻倍放大,对负载比较大或者并发比较高的环境可能存在很大的风险,这点需要提前跟业务沟通好,做好风险评估。支持暂停,但是功能有限。

ActionTech的博客 1507

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

工单分类引擎:自动路由问题到对应技术支持小组

本文介绍如何利用大语言模型与LLama-Factory工具链构建智能工单分类引擎,实现技术支持工单的自动路由。通过LoRA微调技术,可在消费级显卡上高效训练专用模型,并集成至企业ITSM系统,提升服务效率与客户满意度。

weixin_35755562的博客 332

最新PHP程序开发在线工单管理系统源码/售后工单系统(多用户+多客服+短信+邮件通知)

网络在线业务的发展,一些售前售后问题也产生了,为了帮助人们能够更加快速、高效地完成各种工作,分享的在线工单管理系统就是很好的一个工具。它能够帮助企业、组织等单位高效地管理用户提交的工单,提高工作效率,降低人力成本。在这里将为大家介绍最新PHP程序开发在线工单管理系统源码/售后工单系统。

sqll567的博客 2080

毕设项目:B快递公司客户工单管理系统(JSP+java+springmvc+mysql+MyBatis)

传统的手工管理方式已经无法满足快递公司的需求,因此开发一款高效、便捷、实用的客户工单管理系统成为了快递公司迫切需要解决的问题。系统可以实现客户信息的录入、查询、修改和删除等多项业务操作,同时还可以进行订单管理、投诉处理、统计分析等多项服务功能。通过引入先进的技术和理念,B快递公司客户工单管理系统可以大大提高快递公司的服务质量和管理效率,为客户提供更好的快递服务体验。JSP技术生成动态的Web页面,将页面展示给用户。用户发送请求:用户通过浏览器或其他客户端向系统发送请求,请求访问特定的页面或执行特定的操作。

菲林计算机毕设 215

实战指南:在快马平台快速开发并部署基于openclaw的智能工单分类系统

整个开发过程在快马平台上非常顺畅,特别是AI辅助编码功能,能快速生成基础CRUD代码,让我们可以集中精力处理业务逻辑。通过REST API方式调用预训练好的分类模型,对工单描述文本进行向量化处理,输出概率最高的分类标签。从我的体验来看,这个平台特别适合需要快速验证想法的场景,而且内置的协作功能让团队开发效率提升不少。前端提交工单后,后端先存入数据库,然后异步调用分类服务,最后更新分类结果。在快马平台部署时,MySQL服务会自动配置好,我们只需要准备好建表SQL语句即可。这是最让我惊喜的部分。

IndigoNight21的博客 22

mysql 表字段信息从一张表迁移到另一张表_分享一下贺大师的mysql数据库DBA--40条军规,值得收藏...

概述今天主要分享一下贺大师关于mysql数据库的40条DBA军规,每隔一星期看一遍总有一点收获。一、DBA操作规范1、涉及业务上的修改/删除数据,在得到业务方、CTO的邮件批准后方可执行,执行前提前做好备份,必要时可逆。2、所有上线需求必须走工单系统,口头通知视为无效。3、在对大表做表结构变更时,如修改字段属性会造成锁表,并会造成从库延迟,从而影响线上业务,必须在凌晨0:00后业务低峰期执行,另统...

weixin_39770165的博客 176

【Java毕设源码分享】基于springboot+vue的在线电脑维修工单管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

主要内容:免费开题报告、任务书、全bao定制+中期检查PPT、代码编写、🚢文编写和辅导、🚢文降重、长期答辩答疑辅导、一对一专业代码讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。

QQ_2876970413的博客 742

构建智能工单排查系统:从规则引擎到知识闭环的工程实践

在软件开发和运维领域,自动化与智能化是提升效率的关键方向。其核心原理在于通过预设规则、集成数据源和算法模型,将重复、繁琐的人工操作转化为系统自动执行的流程,从而释放人力专注于更高价值的创造性工作。这一技术价值在问题排查与工单处理场景中尤为凸显,能够显著缩短平均故障恢复时间(MTTR)。具体到应用场景,当系统出现性能瓶颈或异常时,传统的排查需要工程师手动关联日志、监控和链路追踪数据,过程耗时且依赖个人经验。本文介绍的智能工单排查系统,正是这一理念的工程化落地。它通过构建感知、决策、执行、反馈的四层架构,实现了

weixin_30660027的博客 362

基于SpringBoot+Vue的综合小区管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

开源免费分享基于SpringBoot+Vue的综合小区管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】可提供说明文档 可以通过*AIGC**技术包括:MySQL、VueJS、ElementUI、(Python或者Java或者.NET)等等*功能如图所示。可以滴我获取详细的视频介绍

2501_92978028的博客 900

基于SpringBoot+Vue的.js客户关系管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

开源免费分享基于SpringBoot+Vue的.js客户关系管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】可提供说明文档 可以通过*AIGC**技术包括:MySQL、VueJS、ElementUI、(Python或者Java或者.NET)等等*功能如图所示。可以滴我获取详细的视频介绍

QQ1273148749的博客 317

基于SpringBoot+Vue的web智慧社区设计与实现管理系统设计与实现【Java+MySQL+MyBatis完整源码】

开源免费分享基于SpringBoot+Vue的web智慧社区设计与实现管理系统设计与实现【Java+MySQL+MyBatis完整源码】可提供说明文档 可以通过*AIGC**技术包括:MySQL、VueJS、ElementUI、(Python或者Java或者.NET)等等*功能如图所示。可以滴我获取详细的视频介绍

a1694619497的博客 279

基于SpringBoot+微信小程序的物业智慧系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

基于SpringBoot+微信小程序的物业智慧系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】,拿走直接用(附源码,数据库,视频,可提供说明文档(通过*AIGC*)*技术包括:MySQL、VueJS、ElementUI、(Python或者Java或者.NET)等等*功能如图所示。可以滴我获取详细的视频介绍

2501_92839909的博客 788
上一篇: 第36问:用 mysqlslap 压测的结果,为什么比用 sysbench 的结果平稳?
下一篇: 技术分享| MySQL 的 AWR Report?— MySQL 状态诊断报告
爱可生开源社区
博客等级 码龄8年 1937粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值