Google BigTable阅读笔记

【论文阅读笔记】Bigtable: A Distributed Storage System for Structured Data Bigtable 是 Google 设计的用于管理结构化数据的分布式存储系统,可扩展到数千台服务器存储 PB 级数据。它不是关系数据库,而是一种稀疏、分布式、持久性多维排序映射(K/V)。Bigtable被 60 多个 Google 产品使用,涵盖不同数据规模和延迟要求的应用,这得益于 BigTable 提供的简单数据模型可以使客户端动态控制数据的布局和格式。 阅读详情

Google BigTable阅读笔记


摘要
Google BigTable是一个分布式的结构化数据存储系统,用来存储海量的数据,这些数据分布在以千计数的普通PC集群上(GFS,MapReduce都是分布在这样的集群上)。
Google有很多项目都使用BigTable存储数据,如Web索引、Google地图、Google金融等。这些应用对存储量、响应速度、吞吐量需求各异,但BigTable还是成功成为一个灵活且高性能的解决方案。

1.概要
BigTable是一个分布式的结过婚数据存储系统,它存储着PB级别的数据。
BigTable的设计目标是:
(1)适用性广;
(2)扩展方便;
(3)高性能;
(4)高可用;

BigTable和数据库比较类似,它的实现参照了很多数据库的实现策略(并行数据库,内存数据库),但它提供了一套完全不同的接口;
BigTable不支持关系型模型,即不支持schema,它提供的模型允许用户动态控制数据的分布和格式;
BigTable视一切数据为字符串,用户可以把结构化或半结构化的数据串行化到字符串里,进行存储;

2.数据模型
BigTable是一个稀疏的、分布式的、持久化存储的多维排序map,map的索引是行名称、列名称、时间戳,value是只有用户能理解含义的二进制串。
(row:string + column:string + time:int64) => (string)
为什么设计成这样的数据模型呢?首先考虑一种常见的应用,存储网页(webtable):
URL为关键字,URL含有各种属性,每种属性有一定的历史,如下图


图一:网页存储片段

行(rows):
(1)表中的行是任意的字符串(64k上限),对每一行的读写都是原子的;
(2)BigTable通过行关键字组织数据,每个行都能动态分区,每个分区叫一个子表(tablet),子表是数据分布与负载均衡的最小单位;
(3)第二点保证了读取行中少数几列的数据时效率很高,应用层还能利用位置相关特性,将一些需要的数据放置在一起。
仍以存储网页为例:
能够以URL主域反转作为key,进行网页的存储,这样同一个主域下的网页都存在一起,能够提高查询效率。
com.google.maps/site1.html
com.google.maps/site2.html

列族(column families):
(1)列关键字组成的集合叫列族,列族是访问控制的基本单位;
(2)同一个列族下的数据通常类型相同;
(3)列族必须先创建才能使用,创建后,任何一个列关键字下都能存放数据。
(4)一张表可以有无限多个列;
一般来说,一张表中列族不能太多(几百个足以),并且列族在运行期间很少改变。
列族名称由 族名称(family)+限定符(qualifier)组成,其中:
(1)族名称必须是可打印字符;
(2)限定符可以是任意字符;
访问控制、磁盘以及内存的使用统计都是在列族层面进行的。仍以存储网页为例,权限控制能允许某些应用添加新的基本数据、某些应用读取基本数据并创建继承的列族、一些应用则只能浏览。

时间戳(timestamps):
(1)时间戳类型为int64,精度为毫秒;
(2)一份数据可以有多个时间戳版本,以避免版本冲突;
(3)不同时间戳版本的数据按时间戳降序排列,即最新的数据在最前面;
一般来说,只会保存某个数据的最近n个版本,可以设置参数定期进行垃圾收集。
以存储网页为例,存储的网页的时间戳是网页的抓取时间,垃圾收集机制能保证只存储最近3个版本的网页数据。

3.API
BigTable提供了建立和删除表以及列族的API,修改集群、表、列族元数据的API,例如访问权限。
客户端程序能通过这些API对BigTable进行如下操作:
(1)写入或者删除BigTable中的值;
(2)从每行中遍历、查找BigTable的表中的数据子集;
(3)单行上的事务处理,利用这个功能,可以对一个行关键字下的数据进行原子的读-更新-写操作(BigTable并不支持跨行的事务操作);
(4)BigTable允许把数据项作为整数计数器;
(5)BigTable允许用户在服务器的地址空间执行脚本程序;
(6)BigTable可以和MapReduce一起使用,可以利用已开发的wrapper类,把BigTable当做MapReduce的输入和输出。

4.基础构件
BigTable是建立在其他几个Google基础构建基础上的高级别应用:
(1)BigTable使用GFS存储日志、数据文件;
(2)BigTable使用SSTable作为内部存储数据的格式;
(3)BigTable依赖于高可用、序列化的分布式所服务Chubby;

5.实现
BigTable包括三个主要组件:可链入客户端程序的库、一个Master服务器和多个子表(tablet)服务器;针对系统的负载情况,能够很容易的向集群中添加和删除子表服务器。
Master服务器主要负责以下工作:
(1)为子表服务器分配子表;
(2)检测加入或者失效的子表服务器;
(3)均衡子表服务器负载;
(4)对GFS上的文件进行垃圾回收;
(5)相关schema的修改与维护;
Tablet服务器主要负责的工作:
(1)管理子表集合;
(2)子表的读写处理;
(3)子表过大时,自动分隔;

和大部分的单Master分布式系统类似,数据流均不经过Master服务器,客户端直接和Tablet服务器通信,进行数据的读写。
BigTable的客户端程序不必通过Master服务器来获取子表的位置信息,大多数客户端程序甚至完全不用和Master交互。
一个BigTable集群存储了很多表,每个表包含一个子表集合,而每个子表包含某个范围内行的所有数据。初始状态下,每个表只有一个子表,随着数据量的增长,子表会自动分割为100M级别的多个子表。

5.1子表的位置
使用一个三层、类似B+数的结构存储子表的位置信息。


Google BigTable子表位置信息

图二:子表位置信息存储
(1)第一层是一个存储在Chubby中的文件,包含根子表(Root Tablet)的位置信息。
根子表包含了一个特殊的元数据(metadata)表里所有的子表位置信息。元数据表的每个子表包含一个用户子表的集合。
跟子表实际上是元数据表的第一个子表,它被特殊处理过–它永远不会被分割;
(2)第二层是其它各个元数据表,每个子表的位置信息都放在一个行关键字下面,这个关键字由子表所在表的标示符和子表的最后一行编码而成;
(3)第三册是用户子表表的位置信息;
客户端会在树状的存储结构查询子表的位置信息,并缓存这些信息。

5.2子表分配
任何时刻,一个子表只能分配给一个子表服务器。Master中记录了哪些可用的子表服务器,哪些子表分配给了哪些子表服务器等元信息。
当一个子表没有被分配,且某个子表服务器有足够的空间来装载子表,Master会发送装载控制指令给该子表服务器,完成子表的分配。
BigTable使用Chubby跟踪子表服务器的状态,当一个子表服务器启动时,在Chubby的指定目录下会创建一个唯一的文件,代表独占锁。
Master服务器实时监控这个目录,便能知道是否有新的子表服务器加入。如果丢失了独占锁,例如断网、会话丢失、子表服务器自然终止,就认为该子表服务器其停止了子表的服务。
此时Master服务器就会尽快的把子表分配给其他的子表服务器。
如果子表服务器挂掉之前来不及释放自己的独占锁也没有关系,Master会有定时心跳,尝试与子表服务器通信,若无回应,Master会主动解除Chubby上的文件锁。

Master启动时,必须要了解当前子表的分配状态,之后才能修改分配状态,启动步骤为:
(1)Master从Chubby获取唯一的Master锁,以防止集群进入其他的Master;
(2)Master扫描Chubby文件锁目录,获取正在运行的子表服务器列表;
(3)和所有子表服务器通信,获取所有子表分配信息;
(4)扫描元数据表获取所有子表的集合;

5.3子表服务


Google BigTable子表服务

图三:子表服务
如图所示,子表的持久化信息是保存在GFS上的。所有更新日志提交到重做(REDO)日志中。在这些更新操作中,最新提交的那些数据存放在一个排序的缓存中,我们称这个缓存为memtable;较早的更新存放在SSTable中。
为了恢复一个子表,子表服务器首先从元数据表中读取它的元数据,元数据包含组成这个子表的SSTable的列表,以及重做点(REDO point)的集合,这些重做点指向可能含有该子表数据的已提交日志。
子表服务器把SSTable的索引读进内存,通过再次执行重做点之后提交的更新再重建memtable。
(1)对子表服务器的写操作步骤:
检测操作格式,例如完整性;
检测发起者权限;
记录成功操作的日志;
写的内容插入到memtable里。
(2)对子表服务器的读操作步骤:
完整性与权限检查;
合并SSTable与memtable视图完成读数据的合并;

5.4数据压缩(compactions)
数据压缩分为三种:
(1)最小化压缩;
(2)合并压缩;
(3)最大化压缩;

随着写操作的执行,memtable的大小不断增加,当达到一个门限值时,就不再增长,而是转化为SSTable,写入GFS,这种压缩成为最小化压缩(Minor Compaction)
最小化压缩的目的:
(1)限制使用内存:memtable是在内存中的,必须限制大小;
(2)容灾恢复时,减少日志读取量:memtable中的数据是易失的,灾难恢复时,结合SSTABLE+最新的日志就能恢复所有数据;

每次最小化压缩会创建一个SSTable,如果一直实施最小化更新,创建更多的SSTable,则可能导致读操作来临时要读取多个SSTable上的更新数据以获取最新的结果;
解决该问题的方法是:定期后台合并SSTable和memtable的内容,组成的新有序SSTable,这个过程叫合并压缩(Merging Compaction),合并压缩完成后,合并之前的SSTable和memtable就能够被删除了。

合并所有SSTable的合并压缩称为最大化压缩(Major Compaction);最大化压缩是为了解决合并压缩中可能存在被删除数据。
BigTable定期循环扫描所有子表,执行最大化压缩。这种机制允许BigTable按时回收被删除的资源。

6.优化
为了达到对用户的高性能、高可用、高可靠性要求,做了如下优化:
(1)局部性分组(locality groups)
为了提高访问效率,通常不会一起访问的列族分割成不同的局部性分组,例如网页、网页元数据。
(2)压缩(compression)
压缩的目的是减少存储空间;
(3)缓存(Caching)
(4)bloom filter优化
bloom filter是一个经典数据结构:它能快速准备的判断一个元素不在一个集合中。
Google用它来优化判断SSTable的位置。
(5)日志提交实现
追加日志;
日志关键字排序;
(6)快速恢复
子表从一个子表服务器转移到另一个子表服务器时,必须先做一次最小化压缩;
这样做的好处是,新子表服务器装载子表时不需要从日志中进行恢复。
(7)不变性
SSTable是固化到磁盘上的,因此其访问无需同步;
删除也可以通过标记完成;

7.经验教训
(1)任何错误随时都可能发生:网络中断、协议错误、内存数据顺滑、时钟偏差、网络分区;
(2)添加特性需要慎重:分行事务真的需要么?
(3)监控尤其重要;
(4)简介的设计和编码会给维护和调试带来巨大的帮助;


Google分布式系统三大论文(二)Bigtable: A Distributed Storage System for Structured Data 修正了alex翻译版的几个欠妥之处 Bigtable:一个分布式的结构化数据存储系统 摘要 Bigtable是一个管理结构化数据的分布式存储系统,它被设计用来处理海量数据:分布在数千台通用服务器上的PB级的数据。Google的很多项目将数据存储在Bigtable中,包括Web索引、Google Earth、Google Finance。这些应用对Bigtable提出的要求差异非常大,无论 阅读详情

相关推荐

BigTable原理详解

BigTable是Google设计的分布式数据存储系统,用来处理海量的数据的一种非关系型的数据库,该pdf详细解释了bigtable的原理。 BigTable是非关系的数据库,是一个稀疏的、分布式的、持久化存储的多维度排序Map。Bigtable的设计目的是可靠的处理PB级别的数据,并且能够部署到上千台机器上。Bigtable已经实现了下面的几个目标:适用性广泛、可扩展、高性能和高可用性。Bigtable已经在超过60个Google的产品和项目上得到了应用,包括 Google Analytics、GoogleFinance、Orkut、Personalized Search、Writely和GoogleEarth。这些产品对Bigtable提出了迥异的需求,有的需要高吞吐量的批处理,有的则需要及时响应,快速返回数据给最终用户。它们使用的Bigtable集群的配置也有很大的差异,有的集群只有几台服务器,而有的则需要上千台服务器、存储几百TB的数据。

BigData入门(三):BigTable

1、BigTable简介 2、数据模型 3、BigTable所用到的构件 4、BigTable架构 1、BigTable简介 GFS是文件级别的分布式存储,那BigTable则是表级别的分布式存储。Bigtable 是一个分布式的结构化数据存储系统,它被设计用来处理海量数据:通常是分布在数千台普通服务器上的 PB 级的数据。Bigtable 的设计目的是可靠的处理 PB 级别的数...

蓬莱道人的博客 3916

Zotero PDF Translate插件实战:DeepL API免费申请与高效翻译配置指南

本文提供Zotero PDF Translate插件配置DeepL API的完整实战指南。详细介绍了如何免费申请DeepL API密钥,解决国内访问问题,并在插件中完成精细配置,实现文献阅读时的无缝划词翻译,大幅提升科研人员和学生的英文文献阅读效率。

rum55的博客 457

在gcp上开始使用bigtable

If you’ve never looked at it before Bigtable can seem a little unapproachable. In this tutorial we’ll get you past that and guide you through your first steps with Bigtable so you can start using this...

weixin_26717681的博客 951

5GCPE与4G物联网卡兼容实战:通过AT指令修改IMEI实现设备迁移

本文详细介绍了如何通过AT指令修改5GCPE设备的IMEI,实现4G物联网卡的设备迁移。从硬件准备、驱动安装到串口工具配置,再到具体的AT指令操作步骤,提供了全面的实战指南。文章还包含信号优化、APN设置等实用技巧,帮助用户顺利完成设备迁移并提升网络性能。

weixin_28684757的博客 629

【Godot4自学手册】第一节配置Godot运行环境

Godot是一款自由开源、由社区驱动的 2D 和 3D 游戏引擎!它是一款功能丰富的跨平台游戏引擎,可以通过统一的界面创建 2D 和 3D 游戏。它提供了一套全面的通用工具,因此用户可以专注于制作游戏,而无需重新发明轮子。游戏可以一键导出到多个平台,包括主流的桌面平台(Linux、macOS、Windows)、移动平台(Android、iOS)、基于 Web 的平台以及主机平台。

zhaoyang314的博客 5983

《Google-Bigtable》读书笔记

“Bigtable为客户提供了简单的数据模型,利用这个模型,客户可以动态控制数据的分布和格式,用户也可以自己推测底层存储数据的位置相关性。”这也就要求,表的结构是与业务紧密相关的,写代码的人,不得不去了解是如何存储的,否则查询效率会很低。 “Bigtable通过行关键字的字典顺序来组织数据”,这个与关系数据库看似一致,关系数据库不是有索引么,表呈现的时候也是按照字典序的,但是Bittable中的“组

胜利者的经验并不复杂,那就是寻找人生的关键点,并在关键时刻竭尽全力 1536

单细胞转录组分析(scRNA-seq)

单细胞转录组测序(Single-cell RNA sequencing,scRNA-seq)是一种高通量测序技术,可以在单细胞水平解析基因表达情况,揭示细胞异质性,探索稀有细胞类型,并研究细胞状态转换及动态调控机制。与传统的。

大甘的博客 6148

BigTable读书笔记

对BigTable的原理、实现、优化进行简介

架构师专栏 3616

贝叶斯时空模型-INLA-4

该文章中,会简化数学计算的过程,主要是针对,在有数据的基础上,如何应用贝叶斯时空模型,找出影响因素,绘制时间变化的空间分布预测图。上述中关键一步与前几期介绍的不一样的地方是,我们加入了n.group参数,用来指定年份,先看一下Year有多少年的,然后封装在s.index里面。在前述的内容中,我们介绍了,如何处理空间的数据,利用海拔高度预测降雨量的例子。建立好数据及mesh以后,我们现在写INLA公式,如果不考虑残差项,那就是固定效应,现在我们增加残差项,及空间与时间效应。这里的Mesh设定值为10,20。

学习中 2948

【FastDDS】Layer DDS之Subscriber ( 09-Accessing received data)

Fast DDS提供了多种接收数据访问方式:通过读取(read)或提取(take)操作获取数据,其中提取会移除数据而读取保留数据。应用程序可通过序列高效借用接收队列内存,但需及时归还。数据处理时需检查SampleInfo的有效性,可通过监听器回调或等待集机制异步获取数据。等待集允许线程专门等待新数据到达,通过条件触发和超时控制实现可靠的数据接收处理。

Ray Home 863

论文学习笔记:BigTable

前言:Google大数据处理的3篇核心论文 《The Google File System》:http://research.google.com/archive/gfs.html 《MapReduce: Simplified Data Processing on Large Clusters 》:http://research.google.com/archive/mapreduce

依然的专栏 3147

ZYNQ GP总线实现PS与PL交互

3,完成 ZYNQ7 Processing System 的配置更改后,回到 Diagram 界面中,可以看到新出现了名为 M_AXI_GP0_ACLK、M_AXI_GP0 和 FCLK_CLK0 的接口,下面我们要对这些接口进行连接或引出。此处的偏移量,AXI的相邻寄存器偏移量相差4个字节,默认slv_reg0的偏移量是0,可以推导出slv_reg1,slv_reg2的偏移量分别为4和8,这里只用到了slv_reg0,所以偏移量为0。当然了,窗口数量的增加,势必会使得单个窗口的采样深度变小。

wangjie36的博客 7094

Google Bigtable论文阅读理解笔记

1.数据模型 原文:A Bigtable is a sparse,distributed,persistent multi-dimensional sorted map. 六个关键词,分别是: sparse:稀疏 distributed:分布 persistent:持久化 multi-dimensional:多维 sorted:有序 map:位图 下面以一个具体示例,更直观的理解上述六个关键...

山不转的博客 719

信号与电源完整性5:轨道塌陷噪声/电源轨道噪声分析及降低解决方案

经过上一节关于串扰的分析,我们已经清楚,噪声问题不仅仅来源于信号网络;电源和地网络所产生的噪声,被反馈到其所在的元器件和信号网络时,其破坏力也是巨大的;本节所讨论的轨道塌陷噪声就是一个典型的实例。在经过电源的地网络的电流发生改变时,在电源和地之间的阻抗上将产生一个压降;由于该压降的产生,用电元件的电压将直接被拉低,甚至可能对电路产生功能性的错误。接下来硬小二将详细的分析电源轨道噪声和降低其的解决方法。...

fydar的博客 2241

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Google三驾马车-Bigtable-论文笔记

什么是Bigtable相比于传统的关系型数据库,bigtable 提供了分布式的非结构化的数 据存储,但没有提供sql的语义,所以是数据NoSQL的数据库。事实上它还是一个分布式的多层map的存储的结构Building Blocks在bigtable 用了其他的很多的Google的组件。使用Google分布式文件系统(GFS)存储日志和数据文件。BigTable还依赖一个高可用的、持久化的分布式锁...

sherlockke的博客 1038

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

bigtable google 论文阅读

结构化数据的分布式存储系统 bigtable 摘要: bigtable在google公司内部的多种应用场景,无论是大数据规模,还是实时性高的场景,都能灵活的提供解决方案。应对的是PB级别以上的数据。下面介绍具体的bigtable架构   1.introduction: 将bigtable与数据库进行比较,有很多实现策略都很相似。并行数据库和主存数据库都实现了扩展性和高性能。不同的是,bi...

bigbugss的博客 1390

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【论文感悟1】Google Bigtable

阅读Google Bigtable之感悟   之前对ApacheHadoop的一系列产品有所研究,追根溯源,在拜读了Google的三篇经典论文之后,自己对衍生自Google这几篇论文的Hadoop家族的产品有了更加深刻的认识。   这篇博客是对GoogleBigtable这篇论文的读后感,因水平有限,本文只是作为自己学习的小结,文中有不妥之处,还请批评指正。  

djy572568633的专栏 1278

BigTable论文阅读-个人翻译

更多文章欢迎来沈小黑的菜园转转啦啦啦~~ Bigtable是2005年谷歌的论文:《Bigtable: A Distributed Storage System for Structured Data》中介绍的一种分布式存储系统,后来被Hadoop社区实现为HBase。读懂这篇论文,那么理解HBase也就非常容易了。本篇博客略去了性能评估、API和应用实例的部分,只讲比较关键的设计与机制部分。这篇论

沈小黑的博客 2321

关于Google的GFS、MapReduce、BigTable三大技术资料

MapReduce/GFS/BigTable三大技术资料 首先是在孟岩博客中发现以下内容: Google的三大核心技术MapReduce、GFS和BigTable的论文都已经被翻译成高质量的中文;三篇论文的链接地址如下: MapReduce: http://blog.youkuaiyun.com/active1001/arch

Harrytsz的博客 2186

Bigtable: A Distributed Storage System for Structured Data阅读笔记

脚本采用谷歌专为数据处理开发的一种名为Sawzall的语言编写。不支持脚本向Bittable写入数据,主要用于数据转换、任意表达式过滤和聚合汇总。真实世界的分布式系统故障远比理论复杂内存与网络数据损坏、巨大的时钟漂移、机器卡死、非对称网络分区、底层系统(如 Chubby)的 Bug、GFS 配额溢出以及计划内外的主机维护。应对手段:在 RPC 机制中强制引入了校验和以对抗数据损坏。消除模块之间的盲目信任。例如,系统不再假设 Chubby 某项操作只会返回几种固定的标准错误代码。

rootzhang123的博客 379

google bigtable论文原文_CTR论文笔记[1]:Wide&Deep

感觉自己对CTR的论文读的太少,因此后续会在专栏记录一下阅读论文的笔记和心得。2016年Google发表了文章《Wide & Deep Learning for Recommender Systems》,本文主要记录了在读论文时的笔记和一些心得。一、论文笔记1、目的:同时解决Memorization和Generalization问题。Memorization:根据人工经验和业务背景,选择可...

weixin_39928648的博客 197

Google论文、开源与云计算

文章目录一.Google论文与开源二.Google论文简介2.1 起源2.2 基础设施2.3 计算分析系统2.4 存储&数据库2.5 AI三.总结 一.Google论文与开源 自1998年成立,至今Google已走过20个年头。在这20年里,Google不断地发表一些对于自己来说已经过时甚至不再使用的技术的论文,但是发表之后总会有类似系统被业界实现出来,也足以说明google的技术至少领先业界数年。在Amazon不断引领全球云计算浪潮开发出一系列面向普罗大众的云产品的同时;Google也在不断引领构

独立开发,substack顶级编辑 1万+

【大数据】bigtable,分布式数据库的鼻祖

看懂这一篇,就能理解分布式数据库的核心,详聊分布式数据库的鼻祖bigtable。

BugMan的博客 6164

bigtable

BIGTABLE 一个结构化数据的分布式数据存储系统,主要解决大数据量存储的问题。 数据模型为: Rows 通过行键来指定,例如com.cnn.www Column Families  Column keys are grouped into sets called column families, which form the basic unit of access control.

用小弟弟思考的程序员 700

google bigtable论文原文_SCI论文阅读与写作必备翻译工具

在阅读和写作SCI文献时,选择一款合适并且好用的翻译软件将会对我们的工作起到事半功倍的效果。今天我们就来总结一下那些适合生物医药类专业的好用的翻译工具。01Google浏览器翻译Google 浏览器的语言翻译功能强大,不仅支持中英互译,还有法、德、日、韩、捷克语等多种语言,并且可以自动检测语言。Google浏览器翻译操作十分简单,且界面友好,最重要的是不会有弹出广告。可以直接将要翻译的内...

weixin_39664994的博客 449
上一篇: Google MapReduce阅读笔记
下一篇: Hypertable 简介 (Hypertable一个 C++ 的Bigtable开源实现)
cool_time
博客等级 码龄19年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值