数据库分库分表

分库分表概念以及应用场景 B+树叶子存的是数据,内部节点存的是键值+指针。如果你的系统处于快速发展时期,如果每天的订单流水都新增几十万,并且,订单表的查询效率明变慢时,就需要规划分库分表了。方案,比如订单id在04000万的区间,划分为订单库1,id在4000万8000万的数据,划分到订单库2,将来要扩容时,id在8000万~1.2亿的数据,划分到订单库3。分库分表采取的是分而治之的策略,分库目的是减轻单台MySQL实例存储压力及可扩展性,而分表是解决单张表数据过大以后查询的瓶颈问题,坦白说,这些问题也是所有关系型数据库的。 阅读详情

数据库分库分表的应用场景及解决方案

  现实业务场景中,为了保障客户体验并满足业务的线性增长。会对数据量巨大,且业务会始终进行的产品进行分表分库策略。但是如何合理的根据业务采取争取的分表分库策略至关重要。下面以具体实例来进行分析。

• 场景一:用户中心,单key业务如何进行数据库切分

• 场景二:订单中心,多key业务如何进行数据库切分




在这里插入图片描述






场景一:用户中心数据库切分架构实践|场景介绍

用户中心是一个十分常见的业务系统,涵盖用户登录、注册、信息查询与修改等服务。

  用户的核心元数据为:

    User(uid,login_name,nickname,password,sex,age)

   其中 ● uid :用户ID,主键

           ● login_name,nickname,password,sex,age :用户的其他属性

在业务初期,单表单库就能满足业务需求:
在这里插入图片描述


场景一:用户中心数据库切分方法|范围法

  当数据量越来越大时,需要对数据库进行水平切分,常见的切分算法有“范围法”和“哈希法”。

  范围法:以用户中心的业务uid为划分依据,将数据水平切分到两个数据库实例上去:
在这里插入图片描述


范围法的优点是:

• 切分策略简单,根据uid,按照范围,user- center很快能够定位到数据在哪个库上

• 扩容简单,如果容量不够,只要增加user-db3即可

范围法的不足是:

• uid必须要满足递增的特性

• 数据量不均,新增的user-db3,在初期的数据会比较少

• 请求量不均,一般来说,新注册的用户活跃度会比较高,故user-db2往往会比user-db1负载要高,导致服务器利用率不平衡



场景一:用户中心数据库切分方法|哈希法

哈希法:以用户中心的业务uid为划分依据,将数据水平切分到两个数据库实例上去:
在这里插入图片描述


哈希法的优点是:

•切分策略简单,根据uid,按照范围,user- center很快能够定位到数据在哪个库上

•数据量均衡:只要uid是均衡的,数据在各个库上的分布一定是均衡的

•请求量均衡:只要uid是均衡的,负载在各个库上的分布一定是均衡的

哈希法的不足是:

•扩容麻烦,如果需要增加一个库,需要重新hash,这有可能会导致数据迁移,给平滑升级带来困难。



场景一:用户中心数据查询需求分析

任何脱离业务的架构设计都是耍流氓,在进行架构讨论之前,首先要对业务进行简要分析,看看表结构上有哪些查询需求。

根据业务经验,用户中心往往有以下几类业务需求:

(1)用户侧,前台访问,最典型的有两类需求

  用户登录:通过login_name/email/phone查询用户实体,1%的请求属于这种类型。

  用户信息查询:登录之后,通过uid来查询用户的实例,99%请求属于这种类型。

  用户侧查询的基本特点是:基本是单条记录查询,访问量大,服务要求高可用,并且对一致性要求较高。

(2)运营侧,后台访问。需要满足产品及运营层面的各类需求,访问模式各异,按照年龄、性别、登录时间、注册时间等属性来 进行查询。运营侧需求的的基本特点是:大量的批量分页查询需求,访问量较低,对可用性要求不高,对一致性的要求也没有这么严格。


场景一:用户中心数据查询需求解决方案-用户侧

1.索引表法:

思路:uid可以直接定位到数据库,login_name不可以直接定位到库。建立login_name到login_id的映射关系。

解决方案:

   • 建立一个索引表记录login_name->uid的映射关系

   • 用login_name来访问时,先通过索引表查询到uid,再定位相应的库

   • 索引表属性较少,可以容纳非常多数据,一般不需要分库

   • 如果数据量过大,可以通过login_name来分库

不足:多一次数据库查询,性能下降一倍。

2.缓存映射法:

思路:访问索引表的性能比较低。将映射放在缓存中可以获得更好的性能体验。

解决方案:

  • login_name查询先到cache中查询uid,再根据uid定位数据库

  • 假设cachemiss,采用扫全库法获取login_name对应的uid,放入cache

  • login_name到uid的映射关系不会变化,映射关系一旦放入缓存,不会更改,无需淘汰,缓存命中率超高

  • 如果数据量过大,可以通过login_name进行cache水平切分

不足:多一次cache查询。

3.login_name生成uid

  思路:不进行远程查询,由login_name直接得到uid

  解决方案:

    • 在用户注册时,设计函数login_name生成uid,uid=f(login_name),按uid分库插入数据

    • 用login_name进行登录时,先通过函数计算出uid,再由uid路由到对应数据库进行查询。

  不足:对login_name到uid的生成函数要求较高,有uid生成冲突的风险

4.login_name基因融入uid

  思路:从login_name抽取“基因” 融入uid中。

在这里插入图片描述

解决方案:

  • 在用户注册时,设计函数login_name生成4bit基因,login_name_gene=f(login_name),如上图粉色部分

  • 同时,生成60bit的全局唯一id,作为用户的标识,如上图绿色部分

  • 接着把4bit的login_name_gene也作为uid的一部分,如上图屎黄色部分

  • 生成64bit的uid,由id和login_name_gene拼装而成,并按照uid分库插入数据

  • 用login_name来访问时,先通过函数由login_name再次复原4bit基因,login_name_gene=f(login_name),通过 login_name_gene%8直接定位到库


场景一:用户中心数据查询需求解决方案-运营侧

后台运营侧的查询需求各异,基本是批量的分页查询,计算量和返回数据量较大,比较消耗数据库性能。此时如果后台业务和前台业务共用一批服务和同一个数据库。有可能会导致后台少数几个请求的批量查询的低效访问造成数据库服务器cpu瞬时100%,影响前台用户的正常访问。另外,由于后台业务的查询需求多种多样,需要在数据库上建立多种索引,这些索引会占用大量的内存和磁盘,从而造成前台业务的uid/login_name的查询和写入性能大幅度降低,处理时间增长。对这一类业务,应该采用“前后台分离”的架构方案:

在这里插入图片描述

场景二:订单中心数据查询需求分析

  还是那句话,任何脱离业务的架构设计都是耍流氓,在进行架构讨论之前,首先要对业务进行简要分析,看看表结构上有哪些查询需求。

  根据业务经验,订单中心往往有以下几类业务需求:

(1)用户侧,前台访问,最典型的有三类需求

  订单实体查询:通过oid查询订单实体,90%都是这种需求。

  用户订单列表查询:通过buyer_id分页查询用户历史订单列表,9%流量属于这种需求。

  商家订单列表查询:通过seller_uid分页查询商家历史订单列表,1%流量属于这类需求。

  前台访问的特点是:吞吐量大,服务要求高可用,对一致性要求较高。其中商家对一致性要求较低,可以接受一定程度的延迟。

(2)运营侧,后台访问。根据产品、运营需求,访问模式各异:按照时间,架构,商品和详情来进行查询

  后台访问的特点:运营侧的查询基本上是批量的分页查询,访问量低,对可用性一致性的要求不高,允许秒甚至十秒级别的查询延迟。


场景二:订单中心数据查询需求解决方案

  后台运营侧的查询需求各异,基本是批量的分页查询,计算量和返回数据量较大,比较消耗数据库性能。此时如果后台业务和前台业务共用一批服务和同一个数据库。有可能会导致后台少数几个请求的批量查询的低效访问造成数据库服务器cpu瞬时100%,影响前台用户的正常访问。对这一类业务,应该采用“前后台分离”的架构方案:前台业务架构不变,站点访问,服务分层,数据库水平切分。

在这里插入图片描述

场景二:订单中心数据库切分方法

   明确了订单中心的访问需求后,问题转化为,前台的oid,buyer_id,seller_id如何来进行数据库的水平切分呢?

  需要同时满足以下条件:

  1.根据buyer_uid%n,可以定位到数据库

  2.根据oid%n,可以定位到数据库

  3.根据seller_uid%n,可以定位到数据库

  以上业务是一个1:N(1个买家:N个订单)和N:N(1个买家:N个卖家, 1个卖家:N个买家)的业务场景,对于“多对多”的业务,水平切分应该使用“数据冗余法”


场景二:订单中心数据库切分方法

在这里插入图片描述

   • 当有订单生成时,通过buyer_uid分库,oid中融入分库基因,写入DB-buyer库

  • 通过线下异步的方式,通过binlog+canal,将数据冗余到DB-seller库中

   • buyer库通过buyer_uid分库,seller库通过seller_uid分库,前者满足oid和buyer_uid的查询需求,后者满足seller_uid的查询需求


场景二:订单中心数据库切分方法|数据冗余法

为什么要冗余数据?


互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量。


水平切分会有一个patitionkey,通过patition key的查询能够直接定位到库,但是非patitionkey上的查询可能就需要扫描多个库了。


此时常见的架构设计方案,是使用数据冗余这种反范式设计来满足分库后不同维度的查询需求。


例如:订单业务,对用户和商家都有订单查询需求:

Order(oid,info_detail);

T(buyer_uid,seller_uid,oid);

如果用buyer_uid来分库,seller_uid的查询就需要扫描多库。

如果用seller_uid来分库,buyer_uid的查询就需要扫描多库。



此时可以使用数据冗余来分别满足buyer_uid和seller_uid上的查询需求:

T1(buyer_uid,seller_uid,oid)

T2(seller_uid,buyer_uid,oid)

同一个数据,冗余两份,一份以buyer_uid来分库,满足买家的查询需求;一份以seller_uid来分库,满足卖家的查询需求。



场景二:订单中心数据库切分方法|如何实现数据冗余

在这里插入图片描述

1.服务同步双写

服务同步双写,即由服务层同步写冗余数据。

流程如右图:

(1)业务应用代用服务层,写入数据

(2)服务层将数据写入DB1

(3)服务层将数据写入DB2

(4)服务层返回新增数据成功给业务应用

优点:

•简单,服务层由单写,改为两次写人

•数据一致性较高,双写成功后才返回

缺点:

• 因为由单写变为了两次写入,请求时间增长

• 数据仍有可能不一致(数据写入DB1后,服务宕机或重启,则数据无法写人DB2)



3.线下异步双写

在这里插入图片描述

为了屏蔽“复杂性”,数据双写由线下服务或者任务来完成,不再由服务层完成。

流程如右图:

(1)业务应用代用服务层,写入数据

(2)服务层将数据写入DB1

(3)服务层返回新增数据成功给业务应用

(4)数据会被写入到数据库的log中

(5)线下服务或者任务读取数据库log

(6)线下服务或者任务插入T2数据

优点:

•数据双写与业务完全解耦

•请求处理时间短

缺点:

•返回业务新增成功时,会存在一个数据不一致的时间窗口,但能保证最终一致性

•数据一致性依赖于线下服务或者任务的可凹陷

2,第二章 分库分表方式 垂直分表就是在同一数据库内将一张表按照指定字段分成若干表,每张表仅存储其中一部分字段;垂直分表拆解了原有的表结构,拆分的表之间一般是一对一的关系;垂直分库是指按照业务将表进行归类,然后把不同类的表分布到不同的数据库上面,而每个库又可以放在不同的服务器上,它的核心理念是-专库专用;水平分表就是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中,表的结构没有变化;水平分表解决单表数据量大的问题; 阅读详情

相关推荐

如何进行数据库分库分表

它通过将原本数据量大的数据库拆分成多个单独的数据库,将原本数据量大的表拆分成若干个数据表,使得单一的库、表性能达到最优的效果(响应速度快),以此提升整体数据库性能。将垂直分库和水平分表相结合,按照业务功能将数据库拆分为多个独立的数据库,并对每个数据库中的表进行水平切分。在拆分数据库的同时,还对每个数据库中的表进行水平切分,将一张表的数据拆分为多个小表进行存储。根据需求分析结果,设计具体的分库分表方案,包括切分键的选择、数据的映射关系、数据迁移策略等。:游标有多种类型,包括只读的、可更新的、可滚动的等。

2402_84885073的博客 3028

MySQL QPS/TPS/缓存命中率/数据库压力 查看

show global status like 'uptime' ; -- 启动时间,单位秒 (1)QPS(每秒Query量)  QPS = Questions(or Queries) / seconds  mysql > show  global  status like 'Questions';  -- 没经过查询缓存的sql数量   (2)TPS(每秒事务量)  TPS

Code changes the world! 1797

使用OpenCV进行3D重建:详细指南

3D重建是计算机视觉领域的一项关键技术,它能够从二维图像中恢复出场景的三维结构。这项技术在机器人视觉、增强现实和3D建模等多个领域都有广泛的应用。在本篇技术博客中,我们将详细介绍如何使用OpenCV这一流行的计算机视觉库来实现3D重建。我们将逐步探讨整个过程,包括相机标定、特征点提取与匹配、立体校正、深度图计算以及最终的三维重建。3D重建是一个复杂的过程,涉及多个步骤和多种算法。OpenCV提供了强大的工具来支持这一过程,从相机标定到特征点提取与匹配,再到立体校正和深度图计算,最后实现三维重建。

weixin_41544125的博客 1315

数据优化——分库分表(一)概念及运用场景-详解

分库分表

CabbageDevil成狂成魔之路 1511

PSIM+PIL+CCS三剑客:手把手教你搞定DSP28335的软硬件联合调试

本文详细介绍了如何利用PSIM、PIL与CCS三款工具,实现DSP28335的软硬件联合调试。通过搭建兼容环境、从PSIM仿真生成PIL代码,再到实战联合调试与问题诊断,手把手指导开发者构建从虚拟模型到实际硬件的完整验证闭环,有效提升电力电子与电机驱动等领域的开发效率与可靠性。

weixin_29183637的博客 185

UCOS-III 系统移植

UCOSIII系统移植到GD32F303详细过程 工程代码:https://github.com/jslaobing/techIot_ucosiii_porting

TechIoT - 探索物联网与嵌入式系统 2087

数据库分库分表的应用场景及方法分析

数据库分库分表的应用场景及方法分析一. 数据库经常面临的问题二.解决方法的思量三.急剧膨胀的业务及数据量的影响    以电商领域为例,订单库将订单相关的数据(订单销售,订单售后,订单任务处理等数据)都放在一个数据库中。对于订单的销售数据,性能第一,需要能够承受促销期间每分钟几万到几十万的订单压力;而售后数据,在订单生成后,用于订单物流及订单克服等,性能压力不明显,但是需要保证及时性。将订单的销售数...

varyall的专栏 841

《玩儿起来吧》MATLAB 实时图像处理系列(一二三四)

大家学了图像处理之后,是不是就想学以致用。而要用于生活中,最好的方式就是和摄像头搭配,实现实时图像处理。今天就给大家分享MATLAB实时图像处理的基础方法,希望能帮你快速入门。

HPC_ZY 1万+

mysql 数据库分库分表

听到分库分表我想很多都对这个词不陌生,因为从事开发工作的小伙伴,或多或少都听过这个词的。 1、数据库分库分表有什么作用呢? 举个例子:我的demo数据库中的table1表有列:30 行:4000W,在这张表中查询一个数据是很耗费时间和性能的吧,分库分表就是来解决这个问题的。 2、分库分表,先说分表 (1) 减少数据表的体积 - 拆表 还是上面那个例子,在上面的例子中,列有30列,那么我们就分...

聆听岁月的博客 868

overleaf导入模板

本文介绍了如何在Overleaf平台导入Springer Nature模板。首先下载所需的模板压缩包,然后在Overleaf中选择"Upload project"上传该压缩包。上传后会显示模板文件,包括EPS格式图像文件、LaTeX源文件、BibTeX参考文献文件、PDF输出文件以及文档类文件。这些文件共同构成了完整的LaTeX模板,可用于学术论文写作和排版。

A2787960542的博客 1148

基于DINO自监督学习对YOLO11 Backbone进行预训练

这PoolHead将获取前一层的输出并应用卷积,然后应用自适应平均池化以将特征图的空间维度减小为固定且一致的大小(1x1)。这是必需的,因为否则空间维度会根据输入的大小而变化,这将使将 DINO 头部附加到主干变得困难,因为它需要固定的输入大小。在本指南中,我们将介绍如何使用 Lightly 使用 DINO 预训练 YOLO 11主干,以及如何将其重新加载到 Ultralytics 中进行微调。您可以使用不同的大小,例如,640这与 YOLO 中的默认图像大小更一致,但它也会在训练期间消耗更多 VRAM。

如果想成为中心,那么就到中心去吧。 1014

django mysql 分库分表_Django 数据库读写分离 分库分表

多个数据库配置:DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),},'db2': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db...

weixin_28684825的博客 257

车载软件刷写工具vFlash --- 自动化接口(Automation API)应用简介

车载软件刷写工具vFlash --- 自动化接口(Automation API)应用简介

Soly_kun的博客 359

使用MyCat分库分表报错:ERROR 1105 (HY000): Unknown database ‘db03‘

使用MyCat分库分表报错:ERROR 1105 (HY000): Unknown database 'db03'

m0_47743175的博客 1458

【YOLOv11多模态融合改进】(可见光+红外)涉及像素级融合、特征级融合(中期、中后期、后期)、决策级融合的完整配置步骤以及二次改进方案

在网络输入阶段将多模态数据直接合并,形成统一的特征表示。

Limiiiing的博客 1967

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

一文读懂数据库分库分表

阅读此文你将了解: 什么是分库分表以及为什么分库分表 如何分库分表 分库分表常见几种方式以及优缺点 如何选择分库分表的方式 数据库常见优化方案 对于后端程序员来说,绕不开数据库的使用与方案选型,那么随着业务规模的逐渐扩大,其对于存储的使用上也需要随之进行升级和优化。 随着规模的扩大,数据库面临如下问题: 读压力:并发QPS、索引不合理、SQL语句不合理、锁粒度 写压力:并发QPS、事务、锁粒度 物理性能:磁盘瓶颈、CPU瓶颈、内存瓶颈、IO瓶颈 其他:宕机、网络异常 面对上述问题,常..

魔幻世界 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Database数据库的分库分表,表映射,切换表,使用到了IModelCacheKeyFactory 代码如下:

Database数据库的分库分表,表映射,切换表,使用到了IModelCacheKeyFactory 代码如下: using Microsoft.EntityFrameworkCore; using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading; using

LongtengGensSupreme博客 720

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[面试]常考数据库优化(分库分表+索引+优化DB+缓存)

1、分库分表(当数据记录达到百万级,如一年的客户销售表累计200W条记录)2、添加索引(索引不能直接修改,只能删除后重新建)create index idxname on table user(id);drop index idxname;MySQL单列索引和组合索引(联合索引)的区别详解一个面试题:怎么加速这个where a=’1′ 和 where a=’1′ and b=’2′,答案:a加索引...

wuhuagu_wuhuaguo的博客 1077

什么是分库分表?为什么要分库分表?什么时候需要分库分表?怎么样拆分?(数据库分库分表详解)

分库分表的形式,主要是两种:垂直拆分和水平拆分。而拆分的粒度,一般又分为分库和分表,所以组成的拆分策略最终如下:分库:将一个数据库拆分成多个独立的数据库,每个数据库可以部署在不同的服务器上,从而分散数据存储和访问压力。分表:将一个数据表拆分成多个小表,每个小表可以存储部分数据,从而减少单个表的数据量,提高查询和写入性能。数据库分库分表是一种解决大规模数据和高并发访问的有效技术方案。

tigerhhzz的博客 4095

DB分库分表习题集

正确回答通过率:64.0%[ 详情 ] 推荐指数: ★★★★ 试题难度: 中级垂直切分有 垂直 分库 和 垂直分表1、垂直分库垂直分库相对来说是比较好理解的,核心理念就四个字:专库专用。按业务类型对表进行分类,像订单、支付、优惠券、积分等相应的表放在对应的数据库中。开发者不可以跨库直连别的业务数据库,想要其他业务数据,对应业务方可以提供 API 接口,这就是微服务的初始形态。

jylee的博客 691

数据库分库分表思路

一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。 数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操

weixin_46217160的博客 4501

数据库-分库分表

​ Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,既能够独立部署,又支持混合部署配合使用的产品组成。功能特性:它们均提供标准化的数据水平扩展分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

m0_65419210的博客 2985

数据库分库分表的介绍

概览 :: ShardingSphere (apache.org)ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。Sharding-JDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身。

0 1871

实战中,数据库应如何分库分表

数据库如何分库分表 首先说数据库的分库和分表是两个完全不同的概念。不能混为一谈。但是他们的作用基本上都是为了抗住更大的并发量。 因为在实际生产中,数据库的访问瓶颈是最大概率限制服务器并发性能的。 随着业务的开展,数据库中的数据会大量产生,当表中的数据量达到千万级别的时候,就需要进行分表了,否则一条sql语句查询可能就会耗时很久。 而如果部分库的话,数据库的访问数量就是一个限制最大的点,大量请求过来访问数据库,结果数据库连接达到瓶颈了,那么就会产生大量的阻塞。 切分策略: 1.垂直拆分 2.水平拆分 垂直拆分

shiliu_baba的博客 3708

数据库分库分表中间件及对比

数据库分库分表中间件及对比

爱的叹息的专栏 2390
上一篇: RestTemplate的Post请求
下一篇: 一秒教你学会MySQL-this is incompatible with sql_mode=only_full_group_by错误解决方案
_Romeo
_Romeo 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值