第二次翻译

存储和文件结构

物理存储介质概述

 

大多数计算机系统中存在几种数据存储类型。这些存储介质根据数据访问的速度、购买介质的每单位数据的成本和介质的可靠性进行分类。通常可以得到的媒体有:

隐藏  高速缓存是速度最快、成本最高的存储形式。高速缓存内存相对较小;它的使用由计算机系统硬件管理。我们将不关心管理数据库系统中的缓存存储。但是,值得注意的是,数据库实现者在设计查询处理数据结构和算法时确实注意缓存效果。

 

主内存  用于处理可用数据的存储介质是主存储器。通用机器指令在主存储器上操作。虽然在个人计算机上的主内存可能包含数gb的数据,甚至在大型服务器系统中可能包含数百gb的数据,但是对于存储整个数据库来说,主内存通常太小(或太昂贵)。如果发生电源故障或系统崩溃,通常会丢失主内存的内容。

 

闪存  闪存与主存的不同之处在于,即使电源关闭(或发生故障),存储的数据也会被保留。有两种类型的闪存,称为NAND和NOR闪存。其中,NAND闪存在一定成本下具有更高的存储容量,广泛用于照相机、音乐播放器和手机等设备的数据存储,而且越来越多地用于笔记本电脑。闪存除了非易失性外,每字节的成本比主存低;也就是说,即使关掉电源,闪存也能保存存储的数据。闪存也被广泛用于将数据存储在“USB密钥”中,可以插入计算设备的通用串行总线(USB)插槽。这样的USB密钥已经成为计算机系统之间传输数据的一种流行方式(“软盘”在早期也扮演着同样的角色,但它们有限的容量已经使它们现在过时了)。闪存也越来越多地被用作磁盘的替代品,用于存储适量的数据。这种磁盘驱动器的替代品称为固态驱动器。截至2009年,64 GB的固态硬盘售价不到200美元,容量可达160 GB。此外,闪存越来越多地用于服务器系统,通过缓存频繁使用的数据来提高性能,因为它提供比磁盘更快的访问速度,比主内存更大的存储容量(对于给定的成本)。

 

光存储  最受欢迎的形式的光存储的光盘(CD),可容纳约700 mb的数据和游戏时间约80分钟,和数字视频磁盘(DVD),可容纳4.7或8.5 gb的数据每一侧的磁盘(或磁盘上一个双边17 gb)。表达数字多功能磁盘也被用来代替数字视频磁盘,因为dvd可以保存任何数字数据,而不仅仅是视频数据。数据以光学方式存储在磁盘上,并由激光读取。容量更大的蓝光DVD每层可存储27g,或54g的双层磁盘。只读光盘(CD-ROM)或只读数字视频光盘(DVD-ROM)中使用的光盘不能写入,但提供了预先录制的数据。光盘(CD-R)和数字视频光盘(DVD-R和DVD+R)也有“记录一次”版本,只能写一次;这样的磁盘也称为写一次、读多次(蠕虫)磁盘。还有“多写”版本的光盘(称为CD-RW)和数字视频磁盘(DVD-RW、DVD+RW和DVD- RAM),可以写多次。光盘自动点唱机系统包含一些驱动器和许多磁盘,可以根据需要自动(由机器人手臂)加载到其中一个驱动器中。

 

磁带存储   磁带存储器主要用于备份和存档数据。虽然磁带比磁盘便宜,但是对数据的访问要慢得多,因为磁带必须从一开始就按顺序访问。因此,磁带存储被称为顺序访问存储。相反,磁盘存储被称为直接访问存储,因为可以从磁盘上的任何位置读取数据。磁带具有高容量(目前可用的磁带容量为40到300gb),并且可以从磁带驱动器中删除,因此它们非常适合廉价的档案存储。磁带库(自动点唱机)用于保存异常大的数据集合,例如来自卫星的数据,在一些情况下,这些数据可能包含多达数百tb (1 tb = 1012字节),甚至多个pb (1 pb = 10 15字节)的数据。根据存储介质的速度和成本,可以将它们组织成一个层次结构(图10.1)。更高的水平是昂贵的,但速度很快。当我们沿着层次结构向下移动时,每比特的成本降低了,而访问时间增加了。这种取舍是合理的;如果一个给定的存储系统比其他存储系统(其他属性相同)更快、更便宜,那么就没有理由使用更慢、更昂贵的内存。事实上,许多早期的存储设备,包括纸带和核心存储器,由于磁带和半导体存储器变得更快、更便宜,都被扔进了博物馆。当磁盘价格昂贵且存储容量较低时,磁带本身用于存储活动数据。今天,几乎所有的活动数据都存储在磁盘上,除非在非常罕见的情况下,它们存储在磁带或光学自动唱机中。最快的存储介质—例如,高速缓存和主存储器—被重新划分为主存储器。在这个层次的下一层的媒体——例如,磁性磁盘——被称为辅助存储器,或者在线存储——年代。在层次结构的最底层的媒体——例如磁带和光磁盘点唱机——被称为三级存储或脱机存储。除了各种存储系统的速度和成本外,还有存储波动性的问题。当设备断电时,易失性存储将丢失其内容。在图10.1所示的层次结构中,主存以上的存储系统是易失性的,而主存以下的存储系统是非易失性的。为了安全起见,必须将数据写入非易失性存储器。

 

磁盘和闪存

磁盘为现代计算机系统提供大量的二次存储。虽然磁盘容量逐年增长,但大型应用程序的存储需求也在不断增加,并且增长非常快,在某些情况下甚至比磁盘容量的增长速度还要快。一个非常大的数据库可能需要数百个磁盘。近年来,闪存的存储容量迅速增长,对大部分应用程序来说闪存正日益成为磁盘存储的竞争对手。

实际上,磁盘相对简单(图10.2)。每个盘都有一个扁平的圆形。它的两个表面被一种磁性材料覆盖,并且信息被记录在表面上。这些磁盘由硬质金属或玻璃制成。

 

当磁盘在使用时,驱动电机以恒定的高速旋转它(通常是每秒60、90或120转,但磁盘以每秒250转的速度运行),有一个读写头就在盘面的上方.磁盘表面逻辑上分为轨道,这些轨道被细分为分区。分区是可以从磁盘读取或写入磁盘的最小信息单元。在当前可用的磁盘中,分区大小通常为512字节。每盘约有50,000至100,000磁道,每盘有1至5盘。内磁道(靠近主轴)的长度较小,在当前一代磁盘中,外磁道是相同的。 比内部轨道更多的分区;典型的数字是大约500至1000个分区每轨道在内部轨道,约1000至2000分区每轨道在外部轨道。不同型号的数量各不相同;高容量的模型通常在每个磁道上有更多分区,在每个盘上有更多磁道。

读写磁头以磁学的方式存储关于扇区的信息,作为磁性材料的磁化方向的反转。磁盘的每一侧都有一个读写头,可以在盘片上移动以访问不同的磁道。磁盘通常包含许多磁盘,所有磁道的读写头如下 安装在一个称为磁盘臂的单一程序集上,并一起移动。安装在主轴上的磁盘和安装在磁盘臂上的磁头一起称为磁头盘组件。 在第一轨道上,所有其他盘子上的头也在各自盘子的第一轨道上。因此,所有盘片的第一个轨迹被称为第一个圆柱体。

今天,盘片直径为3英寸的磁盘在市场上占据主导地位。与大直径磁盘(高达14英寸)相比,它们具有更低的成本和更快的寻觅次数(由于较小的搜索距离)。 这在以前是很常见的,但是它们提供了很高的存储容量。直径更小的磁盘用于便携式设备,如膝上型计算机、一些手持计算机和便携式音乐播放器。

读写头尽可能靠近磁盘表面,以增加记录密度。磁头通常只从磁盘表面浮起或飞出微米。盘的旋转产生了小的微风,并且头部组件的形状使得风使磁头浮在盘面的上方。因为它的头部漂浮在离表面那么近的地方,制盘必须经过仔细加工才能平整。   

头部碰撞可能是个问题。如果磁头接触到磁盘表面,磁头就会将记录介质从磁盘上刮下来,破坏已经存在的数据,在老一代的磁碟中,头部接触表面会使被移除的介质变成空气传播,并进入其他磁头和它们的盘片之间,从而导致更多的碰撞;头部撞击可能导致更多的碰撞。 从而导致整个磁盘的故障。当前一代磁盘驱动器使用一层磁性金属薄膜作为记录介质.与旧的氧化物涂层磁盘相比,它们更不容易因头部碰撞而失效。

磁盘控制器在计算机系统和磁盘驱动器的实际硬件之间接口;在现代磁盘系统中,磁盘控制器在磁盘驱动器单元内实现。圆盘控制 ller接受用于读取或写入扇区的高级命令,并启动操作,例如将磁盘臂移动到正确的轨道,以及实际读取或写入数据。再次从检索到的数据中将其与存储的校验和进行比较;如果数据损坏,则新计算的校验和将与存储的校验和不匹配。如果这样的错误发生时,控制器将多次重试读取;如果错误继续发生,控制器将发出读取失败的信号。  

磁盘控制器执行的另一个有趣的任务是重新映射坏扇区。如果控制器检测到一个扇区在磁盘最初格式化时或当尝试编写扇区时,它可以逻辑地将该扇区映射到不同的物理位置(从为此目的预留的额外扇区池中分配)。重映射是在磁盘上或非voll中注意到的。 在新的位置上进行写入。   

磁盘通过高速连接到计算机系统.有许多连接磁盘到计算机的通用接口,其中最常用的接口是。

  1. SATA(代表串行ATA,1和较新版本的SATA II或SATA 3 GB)(较早版本的ATA标准称为PATA,或并行ATA和IDE,在此之前广泛使用; 
  2. 小型计算机系统互连(SCSI;发音为“SCSI”);
  3. SAS(表示串行连接SCSI);
  4. 光纤通道接口。便携式外部SK系统通常使用USB接口或IEEE 1394 FireWire接口。

当磁盘通常通过电缆直接连接到计算机系统的磁盘接口时,它们可以被远程定位,并通过高速网络连接到磁盘控制器。在 存储区域网络(SAN)体系结构,大量磁盘通过高速网络连接到多台服务器计算机上。磁盘通常使用存储器官在本地组织。 称为独立磁盘冗余阵列(RAID)的技术(稍后在10.3节中描述),为服务器提供一个非常大且非常可靠的磁盘的逻辑视图。计算机和磁盘子系统继续使用SCSI、SAS或光纤通道接口协议相互通信,尽管它们可能被网络隔离。通过存储远程访问磁盘网络意味着磁盘可以由多台计算机共享,这些计算机可以并行运行应用程序的不同部分。远程访问还意味着可以保存包含重要数据的磁盘。 在中央服务器室中,它们可以由系统管理员监视和维护,而不是分散在组织的不同部分。

网络附加存储(NAS)是SAN的一种替代。NAS非常类似san,只不过它提供了一个文件系统接口,而不是看起来像是一个大磁盘的网络存储。 网络文件系统协议,如NFS或CIFS。

 

磁盘性能的度量

磁盘性能的主要度量指标是容量、平均寻道时间、传输速率和可靠性。平均寻道时间是从发出读或写的请求到开始数据传输的时间。要访问(即读取或写入)磁盘给定扇区上的数据,磁头必须首先移动,以便将其定位在正确的轨道上,然后必须等待扇区在磁盘旋转时出现在其下方。重新定位磁头的时间称为寻找时间,它随着磁头必须移动的距离而增加。典型的寻道时间从2毫秒到30毫秒不等,这取决于轨迹距离初始磁头位置的距离。较小的磁盘往往具有较低的寻道时间,因为磁头必须走较小的距离。

平均寻道时间是在一系列(均匀分布的)随机请求上测量的寻道时间的平均值。如果所有的航迹都有相同的扇区,并且我们不考虑磁头开始运动和停止运动所需的时间,我们可以证明平均寻道时间是最坏情况下寻道时间的三分之一。考虑到这些因素,平均寻道时间约为最大寻道时间的一半。根据磁盘模型,当前的平均寻道时间在4到10毫秒之间。

磁头到达所需的轨道后,等待扇区出现在磁头下所花费的时间称为旋转延迟时间。现在磁盘的转速从每分钟5400转(90转/秒)到每分钟15000转(250转/秒)不等,或者,相当于每转4毫秒到11.1毫秒。平均而言,要使所需扇区的开始出现在磁头下方,需要旋转磁盘的一半。因此,磁盘的平均延迟时间是磁盘完全旋转时间的一半。

然后,访问时间是查找时间、延迟和范围的总和,一般从8毫秒到20毫秒。一旦要访问的数据的第一个扇区位于磁头之下,数据传输就开始了。数据传输速率是从磁盘检索或存储数据的速率。目前的磁盘系统支持每秒25到100兆字节的最大传输速率;由于磁盘的扇区较少,因此传输速率明显低于磁盘内部轨道的最大传输速率。例如,最大传输速率为每秒100兆字节的磁盘在其内部轨道上的持续传输速率可能为每秒30兆字节左右。

磁盘的最后一个常用度量是平均故障时间(MTTF),它是磁盘可靠性的度量。磁盘(或任何其他系统)的平均故障时间是平均而言,我们可以预期系统在没有任何故障的情况下连续运行的时间量。根据供应商的说法,今天磁盘失效的平均时间从50万到120万小时不等,大约是57到136年。在实践中,声称的平均故障时间是根据磁盘是新磁盘时的故障概率计算的——这个数字意味着给定1000个相对较新的磁盘,如果MTTF为1,200,000小时,其中一个磁盘平均将在1,200小时内故障。平均故障时间为1,200,000小时并不意味着磁盘可以运行136年!大多数磁盘的预期寿命约为5年,并且当它们的使用年限超过几年时,故障率将显著提高。

台式机的磁盘驱动器通常支持串行ATA (SATA)接口,它支持每秒150兆字节,或者用SATA - ii 3Gb接口,它支持每秒300兆字节。pata5接口支持每秒133兆字节的传输速率。为服务器系统设计的磁盘驱动器通常支持ultra - 320 SCSI接口,它提供高达每秒320兆字节的传输速率,或者串行附加SCSI (SAS)接口,其版本提供每秒3或6千兆字节的传输速率。存储区域网络(SAN)设备通过网络连接到服务器,通常使用光纤通道FC 2-Gb或4-Gb接口,提供高达每秒256或512兆字节的传输速率。接口的传输速率在连接到接口的所有磁盘之间共享,串行接口除外,串行接口只允许一个磁盘连接到每个接口。

 

磁盘块访问的优化

磁盘I/O请求由文件系统和大多数操作系统中的虚拟内存管理器生成。每个请求指定要引用的磁盘上的地址;该地址以块号的形式存在。块是由一定数量的相邻扇区组成的逻辑单元。块大小从512字节到几kb不等。数据以块为单位在磁盘和主存之间传输。术语页通常用来指块,尽管在一些上下文中(如闪存)它们指的是不同的东西。

对磁盘块的请求序列可以分为顺序访问模式或随机访问模式。在顺序访问模式中,连续的请求是针对连续块号的,这些块号位于同一轨道上或相邻轨道上。要在顺序访问中读取块,第一个块可能需要磁盘寻道,但是连续的请求要么不需要寻道,要么需要对相邻的磁道进行寻道,这比对较远的磁道进行寻道要快。相反,在随机访问模式中,连续的请求是针对随机位于磁盘上的块的。每一个这样的请求都需要一个请求。每秒一个磁盘可以满足的随机块访问数量取决于查找时间,通常为每秒100到200次访问。由于每次查找只读取少量(一个块)数据,因此随机访问模式的传输速率明显低于顺序访问模式。已经开发了一些技术来提高访问块的速度。

 

缓存  从磁盘读取的块临时存储在内存缓冲区中,以满足将来的请求。缓冲由操作系统和数据库系统共同完成。第10.8节中讨论了数据库缓冲,

更多细节见第10.8节。

 

预读.  当访问一个磁盘块时,从相同的磁盘块连续地访问它

跟踪被读入内存缓冲区,即使没有对块的挂起请求。在顺序访问的情况下,这种提前读取确保在请求许多块时,它们已经在内存中,并且最小化了每次读取块时在磁盘查找和旋转延迟方面所浪费的时间。操作系统还经常对操作系统文件的连续块执行预读。然而,预读对于随机块访问并不是很有用。

 

调度.  如果需要将一个圆柱体中的几个块从磁盘转移到主存储器,我们可以按照块在磁头下通过的顺序来请求这些块,从而节省访问时间。如果所需要的块位于不同的钢瓶上,则以最小化磁盘臂运动的顺序请求块是有利的。磁盘臂调度算法试图以一种增加可处理的访问数量的方式对访问进行排序。电梯算法是一种常用的算法,其工作原理与许多电梯相同。假设,一开始,手臂从最里面的轨道移动到圆盘的外面。在电梯算法的控制下,对于每条有访问请求的轨道,arm都会在该轨道上停止,为该轨道提供服务请求,然后继续向外移动,直到不再有等待的轨道请求。此时,手臂改变方向,向内移动,再次在每条有请求的轨道上停止,直到到达一条没有请求更靠近中心的轨道为止。然后,它反转方向,开始一个新的循环。磁盘控制器通常执行重新排序读请求以提高性能的任务,因为它们非常清楚磁盘上块的组织、磁盘盘的旋转位置和磁盘臂的位置。

 

文件的组织。  为了减少块访问时间,我们可以组织块磁盘在某种程度上与我们所期望的数据相对应访问。例如,如果我们希望按顺序访问一个文件,那么理想情况下,我们应该将文件的所有块按顺序放在相邻的位置汽缸。旧的操作系统,如IBM大型机操作系统,为程序员提供了对文件放置的良好控制,允许程序员为存储文件保留一组柱面。但是,这种控制给程序员或系统管理员带来了负担,例如,决定为一个文件分配多少个柱面,如果要将数据插入或从文件中删除,可能需要进行昂贵的重组。

随后的操作系统,如Unix和Microsoft Windows,向用户隐藏磁盘组织,并在内部管理分配。虽然它们不能保证文件的所有块都是按顺序排列的,但是它们一次为一个文件分配多个连续的块(一个范围)。然后,对文件的顺序访问只需要每个区段执行一次搜索,而不是每个块执行一次搜索。随着时间的推移,具有多个小附加项的顺序文件可能会变得支离破碎;也就是说,它的块分散在整个磁盘上。为了减少碎片,系统可以备份磁盘上的数据并恢复整个磁盘。还原操作将回写每个文件连续(或几乎如此)的块。一些系统(例如不同版本的Windows操作系统)具有扫描磁盘然后移动块以减少碎片的实用程序。通过这些技术实现的性能提高可能很大。

 

非易失性写缓冲区。  由于主内存的内容在电源故障中丢失,有关数据库更新的信息必须记录在磁盘上,以避免可能发生的系统崩溃。因此,更新密集型数据库应用程序(例如事务处理系统)的性能严重依赖于磁盘写的速度。

我们可以使用非易失性随机访问内存(NVRAM)来大幅提高磁盘写速度。NVRAM的内容不会在断电时丢失。实现NVRAM的一种常见方法是使用电池支持的RAM,不过闪存也越来越多地用于非易失性写缓冲。其思想是,当数据库系统(或操作系统)请求将一个块写入磁盘时,磁盘控制器将该块写入NVRAM缓冲区,并立即通知操作系统已成功完成写入。当磁盘没有任何其他请求时,或者当NVRAM缓冲区已满时,控制器将数据写到磁盘上的目标。当数据库系统请求写块时,它只在NVRAM缓冲区已满时才会注意到延迟。在从系统崩溃中恢复时,NVRAM中任何挂起的缓冲写都被写回磁盘。NVRAM缓冲区可以在某些高端磁盘中找到,但在“RAID控制器”中更常见。

 

日志磁盘。  另一种减少写延迟的方法是使用日志磁盘。也就是说,用于编写顺序登录的磁盘与非易失性RAM缓冲区非常相似。基本上,对日志磁盘的所有访问都是顺序的消除了寻道时间,可以同时写几个连续的块,使写入日志磁盘的速度比随机写入快几倍。与以前一样,数据也必须被写到磁盘上的实际位置,但是日志磁盘可以稍后进行写操作,而不需要数据库系统等待写操作完成。此外,日志磁盘可以重新排序写操作,以最小化磁盘臂的移动。如果在对实际磁盘位置的某些写操作完成之前系统崩溃,那么当系统重新启动时,它将读取日志磁盘,以找到那些尚未完成的写操作,然后执行它们。

支持上述日志磁盘的文件系统称为日志文件系统。即使没有单独的日志磁盘,也可以实现日志文件系统,将数据和日志保存在同一个磁盘上。这样做可以降低货币成本,但代价是性能下降。大多数现代文件系统实现日志记录,并在何时使用日志磁盘。

编写内部文件系统信息,如文件分配信息。早期生成的文件系统允许在不使用日志磁盘的情况下进行写重排序,如果系统崩溃,可能会破坏磁盘上的文件系统数据结构。例如,假设使用了一个文件系统。首先写入新节点的数据,然后从以前的节点更新指针,从而在末尾插入一个新节点。还假设写操作被重新排序,因此指针首先被更新,并且在写入新节点之前系统崩溃。然后,节点的内容将是磁盘上早先的任何垃圾,从而导致损坏的数据结构。

 

为了处理这种数据结构损坏的可能性,早期生成的文件系统必须在系统重启时执行文件系统一致性检查,以确保数据结构是一致的。如果不是这样,就必须采取额外的步骤来恢复它们的一致性。这些检查导致系统崩溃后重启时出现长时间的延迟,随着磁盘系统容量的增加,这种延迟会变得更糟。日志文件系统允许快速重启,而不需要进行这样的文件系统一致性检查。但是,应用程序执行的写操作通常不写入日志磁盘。数据库系统实现它们自己的日志记录形式。

 

  如第10.1节所述,闪存有两种类型,NOR闪存和NAND闪存。flash也不允许随机访问内存中的单个单词,并且读取时间与主内存相当。然而,与NOR flash不同的是,从NAND flash读取数据需要将整个页面的数据(通常由512到4096字节组成)从NAND flash获取到主内存中。因此,NAND闪存中的页类似于磁盘中的扇区。但NAND闪存比NOR闪存便宜得多,存储容量也要大得多,而且使用得更广泛。

使用NAND flash构建的存储系统提供了与磁盘存储相同的面向块的接口。与磁盘相比,闪存可以提供更快的随机访问:从闪存中检索一页数据只需1或2微秒,而磁盘上的随机访问需要5到10毫秒。闪存的传输率比磁盘低,一般每秒20兆字节。最近的一些闪存将传输速率提高到每秒100到200兆字节。然而,固态硬盘同时使用多个闪存芯片,将传输速率提高到每秒200兆字节以上,这比大多数磁盘的传输速率都要快。

写入闪存有点复杂。写入闪存页通常需要几微秒。然而,一旦写入,闪存页就不能被直接覆盖。相反,它必须被擦除,随后重写。擦除操作可以在多个页面上同时执行,称为擦除块,耗时约1到2毫秒。擦除块的大小(在flash文献中通常称为“块”)通常比存储系统的块大小大得多。此外,一个flash页面可以被删除的次数是有限制的,通常在100,000到1,000,000次之间。一旦达到这个限制,就可能发生存储位的错误。

闪存系统通过将逻辑页码映射到物理页码来限制删除速度和更新速度的影响。当一个逻辑页面被更新时,它可以被重新映射到任何已经被删除的物理页面,并且原始位置可以稍后被删除。每个物理页面都有一小块存储其逻辑地址的内存区域;如果将逻辑地址重新映射到另一个物理页,则将原始物理页标记为已删除。因此,通过扫描物理页面,我们可以找到每个逻辑页面所在的位置。逻辑到物理的页面映射被复制到内存中的翻译表中,以便快速访问。包含多个已删除页的块将定期被删除,注意首先将这些块中的未删除页复制到另一个块(针对这些未删除页更新翻译表)。由于每个物理页只能更新一个固定数量的时候,多次被清除物理页分配”冷数据”,也就是说,数据很少更新,虽然页面没有被抹去了很多次用于存储“热数据,”也就是说,频繁更新的数据。

这种在物理块之间均匀分布擦除操作的原则称为磨损调平,通常由闪存控制器透明地执行。如果一个物理页面由于过多的更新而损坏,可以将其从使用中删除,而不会影响整个闪存。

所有上述操作都是由一个名为flash translation layer的软件层完成的;在这一层之上,闪存看起来与磁盘存储一样,提供相同的页面/面向扇区的接口,只是闪存快得多。因此,文件系统和数据库存储结构可以看到底层存储结构的相同逻辑视图,无论它是闪存还是磁存储器。混合磁盘驱动器是一种硬盘系统,它结合了磁性存储器和少量的闪存,闪存用作频繁访问数据的缓存。经常访问但很少更新的数据非常适合在闪存中缓存。

 

 

摘至@[Database.System.Concepts(6th.Edition.2010)]..pdf第十章前两小节

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值