达梦数据库简介

达梦发展历程

1992年华中理工大学达梦数据库与多媒体技术研究所成立。

1997年中国电力财务公司华中分公司财务应用系统使用国产数据库DM2。随后,在全国76家分子公司上线使用。

2000年 武汉华工达梦数据库有限公司成立。DM3诞生,在安全领域得到广泛应用,并在国内数据库行业连续多年测评领先。

2004年 研发团队7个月完成两年半的研发工作推出DM4,性能远超国内基于开源技术的数据库,

并在国家测试中继续保持领先。

2006年 DM5在安全可靠及产品化方面得到完善,荣获第十届软博会金奖。达梦公司适应市场需求,调整发展战略,进军大数据市场,达梦开发的中国大数据应用—三峡库区地质灾害预警指挥系统上线。

2008年 中国软件股份有限公司对达梦进行战略投资,公司进入快速发展阶段。

2009年 DM6与国际主流数据库产品兼容性得到大幅提升,在行业等对安全特性要求更高的行业领域得到广泛应用。

2012年 DM7发布。支持大规模并行计算、海量数据处理技术,是理想的企业级数据管理服务平台。

2013年 达梦大数据平台升级发布,提供从大数据存储、交换、管理、到分析和呈现的一体化大数据管理服务。首个基于DM7的海外项目在泰国教育部成功上线运行。

2019年 DM8发布,多样化架构充分满足不同场景需求,支持超大规模并发事务处理和事务-分析混合型业务处理、动态分配计算资源。达梦公司完成了亿元融资。

2020年 “利剑出鞘,智启未来-2020达梦创新产品发布会”在北京盛大召开。同时发布达梦数据共享集群(DMDSC)、达梦启云数据库(DMCDB)、达梦图数据库(GDM)、达梦新一代分布式数据库四款产品。达梦公司主办的“信创人才 万人培养计划”暨 2020 首届达梦数据库精英挑战赛圆满举办。

2024年6月12日,达梦数据登陆上交所科创板上市交易,股票代码688692,成为“国产数据库第一股”。

体系结构

DM8 采用了独特的双存储引擎架构,行存储引擎和列存储引擎可相互配合、协同工作。同时实现了计算层和存储层的分离,同一内核既支持共享存储式集群,也支持分布式事务集群。 相较于目前主流产品架构——不同特性依靠不同内核去实现,DM8 架构为业界首创,也是未来数据库架构的发展方向。
在这里插入图片描述

物理结构

DM 数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等。如下:

在这里插入图片描述

逻辑结构

DM 数据库为数据库中的所有对象分配逻辑空间,并存放在数据文件中。在 DM 数据库内部,所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象都存放在这些表空间中。同时,表空间被进一步划分为段、簇和页(也称块)。通过这种细分,可以使得 DM 数据库能够更加高效地控制磁盘空间的利用率。如下:

达梦数据库逻辑存储结构述

内存结构

数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是 DBMS 系统所必须的。通常内存管理系统会带来以下好处:

  1. 申请、释放内存效率更高;
  2. 能够有效地了解内存的使用情况;
  3. 易于发现内存泄露和内存写越界的问题。

DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。

内存池

DM Server 的内存池包括共享内存池和其他一些运行时内存池。

动态视图 V$MEM_POOL 详细记录了当前系统中所有的内存池的状态,可通过查询这个动态视图掌握 DM Server 的内存使用情况。

共享内存池

共享内存池是 DM Server 在启动时从操作系统申请的一大片内存。

在 DM Server 的运行期间,经常会申请与释放小片内存,而直接向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。于是 DM 采用共享内存池的方式:一次向操作系统申请一片较大内存,作为共享内存池。当系统在运行过程中需要申请小片内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。

DM 系统管理员可以通过 DM Server 的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池大小的参数为 MEMORY_POOL,缺省大小为 500M。如果在运行时所需内存大于配置值,共享内存池也可进行自动扩展,INI 参数 MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小,参数 MEMORY_TARGET 则指定了共享内存池扩展到超过该值后,空闲时会收缩到的大小。

运行时内存池

除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。

缓冲区

数据缓冲区

数据缓冲区是 DM Server 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是 DM Server 至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘 IO 频繁;将其设定得太大,又会导致操作系统内存本身不够用。

系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页,一条是“自由”链,用于存放目前尚未使用的内存数据页,一条是“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改),还有一条即为“脏”链,用于存放已被修改过的内存数据页。

LRU 链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的自由链被用完时,从 LRU 链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,减少 IO。

在系统运行过程中,通常存在一部分“非常热”(反复被访问)的数据页,将它们一直留在缓冲区中,对系统性能会有好处。对于这部分数据页,数据缓冲区开辟了一个特定的区域用于存放它们,以保证这些页不参与一般的淘汰机制,可以一直留在数据缓冲区中。

  1. 类别

DM Server 中有四种类型的数据缓冲区,分别是 NORMAL、KEEP、FAST 和 RECYCLE。其中,用户可以在创建表空间或修改表空间时,指定表空间属于 NORMAL 或 KEEP 缓冲区。RECYCLE 缓冲区供临时表空间使用,FAST 缓冲区根据用户指定的 FAST_POOL_PAGES 大小由系统自动进行管理,用户不能指定使用 RECYCLE 和 FAST 缓冲区的表或表空间。

NORMAL 缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为 NORMAL;KEEP 的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去,主要针对用户的应用是否需要经常处在内存当中,如果是这种情况,可以指定缓冲区为 KEEP。

DM Server 提供了可以更改这些缓冲区大小的参数,用户可以根据自己应用需求情况,指定 dm.ini 文件中 BUFFER(8000MB)、KEEP(8MB)、RECYCLE(300MB)、FAST_POOL_PAGES(3000)值(括号中为默认值),这些值分别对应是 NORMAL 缓冲区大小、KEEP 缓冲区大小、RECYCLE 缓冲区大小、FAST 缓冲区数据页总数。

  1. 读多页

在需要进行大量 I/O 的应用当中,DM 之前版本的策略是每次只读取一页。如果知道用户需要读取表的大量数据,当读取到第一页时,可以猜测用户可能需要读取这页的下一页,在这种情况下,一次性读取多页就可以减少 I/O 次数,从而提高了数据的查询、修改效率。

DM Server 提供了可以读取多页的参数,用户可以指定这些参数来调整数据库运行效率的最佳状态。在 DM 配置文件 dm.ini 中,可以指定参数 MULTI_PAGE_GET_NUM 大小(默认值为 1 页),来控制每次读取的页数。

如果用户没有设置较适合的参数 MULTI_PAGE_GET_NUM 值大小,有时可能会给用户带来更差的效果。如果 MULTI_PAGE_GET_NUM 太大,每次读取的页可能大多都不是以后所用到的数据页,这样不仅会增加 I/O 的读取,而且每次都会做一些无用的 I/O,所以系统管理员需要衡量好自己应用需求,给出最佳方案。

日志缓冲区

日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘 IO 而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。那么为何不在数据缓冲区中缓存重做日志而要单独设立日志缓冲区呢?主要是基于以下原因:

  1. 重做日志的格式同数据页完全不一样,无法进行统一管理;
  2. 重做日志具备连续写的特点;
  3. 在逻辑上,写重做日志比数据页 IO 优先级更高。

DM Server 提供了参数 RLOG_BUF_SIZE 对日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量。

字典缓冲区

字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,如进行查询语句,就需要相应的表信息、列信息等,这些字典信息如果都在缓冲区里,则直接从缓冲区中获取即可,否则需要 I/O 才能读取到这些信息。

DM8 采用的是将部分数据字典信息加载到缓冲区中,并采用 LRU 算法进行字典信息的控制。缓冲区大小设置问题,如果太大,会浪费宝贵的内存空间,如果太小,可能会频繁的进行淘汰,该缓冲区配置参数为 DICT_BUF_SIZE,默认的配置大小为 5M。

DM8 采用缓冲部分字典对象,那会影响效率吗?数据字典信息访问存在热点现象,并不是所有的字典信息都会被频繁的访问,所以按需加载字典信息并不会影响到实际的运行效率。

但是如果在实际应用中涉及对分区数较多的水平分区表访问,例如上千个分区,那么就需要适当调大 DICT_BUF_SIZE 参数值。

SQL 缓冲区

SQL 缓冲区提供在执行 SQL 语句过程中所需要的内存,包括计划、SQL 语句和结果集缓存。

很多应用当中都存在反复执行相同 SQL 语句的情况,此时可以使用缓冲区保存这些语句和它们的执行计划,这就是计划重用。这样带来的好处是加快了 SQL 语句执行效率,但同时给内存也增加了压力。

DM Server 在配置文件 dm.ini 提供了参数来支持是否需要计划重用,参数为 USE_PLN_POOL,当指定为非 0 时,则启动计划重用;为 0 时禁止计划重用。DM 同时还提供了参数 CACHE_POOL_SIZE(单位为 MB),来改变 SQL 缓冲区大小,系统管理员可以设置该值以满足应用需求,默认值为 20M。

结果集缓存包括 SQL 查询结果集缓存和 DMSQL 程序函数结果集缓存,在 INI 参数文件中同时设置参数 RS_CAN_CACHE=1 且 USE_PLN_POOL 非 0 时 DM 服务器才会缓存结果集。DM 还提供了一些手动设置结果集缓存的方法,具体可参看 22.10 节。

客户端结果集也可以缓存,但需要在配置文件 dm_svc.conf 中设置参数:

ENABLE_RS_CACHE = (1) 	//表示启用缓存;
RS_CACHE_SIZE = (100)  	//表示缓存区的大小为100M, 可配置为1-65535
RS_REFRESH_FREQ = (30) 	//表示每30秒检查缓存的有效性,如果失效,自动重查; 0表示不检查。

同时在服务器端使用 INI 参数文件中的 CLT_CACHE_TABLES 参数设置哪些表的结果集需要缓存。另外,FIRST_ROWS 参数表示当查询的结果达到该行数时,就返回结果,不再继续查询,除非用户向服务器发一个 FETCH 命令。这个参数也用于客户端缓存的配置,仅当结果集的行数不超过 FIRST_ROWS 时,该结果集才可能被客户端缓存。

排序区

排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。

DM Server 提供了参数来指定排序缓冲区的大小,参数 SORT_BUF_SIZE 在 DM 配置文件 dm.ini 中,系统管理员可以设置其大小以满足需求,由于该值是由系统内部排序算法和排序数据结构决定,建议使用默认值 2M。

哈希区

DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希操作。

DM Server 在 dm.ini 中提供了参数 HJ_BUF_SIZE 来进行控制,由于该值的大小可能会限制哈希连接的效率,所以建议保持默认值,或设置为更大的值。

除了提供 HJ_BUF_SIZE 参数外,DM Server 还提供了创建哈希表个数的初始化参数,其中,HAGR_HASH_SIZE 表示处理集函数时创建哈希表的个数,建议保持默认值 100000。

线程结构

DM 服务器使用“对称服务器构架”的单进程、多线程结构。这种对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM 数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。

DM 进程中主要包括监听线程、IO 线程、工作线程、调度线程、日志线程等,以下分别对它们进行介绍。

监听线程

监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。

DM 服务器所有配置端口的范围为 1024-65534,默认5236。当客户端工具发起连接时,由操作系统为客户端工具自动分配一个端口用于与 DM 服务器进行通信。对于数据守护、DMDSC、DM MPP 和 DMDPC 等分布式数据库中各实例节点之间的通信,发起连接的节点也由操作系统自动分配端口,所以配置主备/DMDSC/DM MPP/DMDPC 时,除了各实例指定的端口外,发起连接的实例也会有操作系统自动分配的用于和其他实例进行通信的端口。

工作线程

工作线程是 DM 服务器的核心线程,负责服务器各种类型任务的处理及所有实际的数据相关操作。工作线程包括任务工作线程和会话工作线程等。

任务工作线程负责处理服务器内部生成并加入对应任务队列的各项任务,如调度线程生成的清理缓存任务、异步执行的任务等,其初始个数由 INI 参数 TASK_THREADS 指定。任务工作线程空闲时从任务队列依次摘取任务并进行处理,当任务队列中的任务堆积时,系统会增加任务工作线程数量以减少任务堆积。

会话工作线程负责处理会话的请求任务,分为非线程池模式和线程池模式,由 INI 参数 STHD_FLAG 控制。非线程池模式下每一个会话对应一个会话工作线程,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。线程池模式初始工作线程个数由 INI 参数 WORKER_THREADS*STHD_THREAD_NUM 指定,由会话轮询线程接收所有用户请求,加入会话任务队列,会话工作线程从会话任务队列依次摘取请求任务进行处理。

IO 线程

在数据库活动中,IO 操作历来都是最为耗时的操作之一。当事务需要的数据页不在缓冲区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把 IO 操作从工作线程中分离出来则是明智的做法。IO 线程的职责就是处理这些 IO 操作。

通常情况下,DM Server 需要进行 IO 操作的时机主要有以下三种:

  1. 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
  2. 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
  3. 检查点到来时,需要将所有脏数据页写入磁盘。

IO 线程在启动后,通常都处于睡眠状态,当系统需要进行 IO 时,只需要发出一个 IO 请求,此时 IO 线程被唤醒以处理该请求,在完成该 IO 操作后继续进入睡眠状态。

IO 线程的个数是可配置的,可以通过设置 dm.ini 文件中的 IO_THR_GROUPS 参数来设置,默认情况下,IO 线程的个数是 2 个。同时,IO 线程处理 IO 的策略根据操作系统平台的不同会有很大差别,一般情况下,IO 线程使用异步的 IO 将数据页写入磁盘,此时,系统将所有的 IO 请求直接递交给操作系统,操作系统在完成这些请求后才通知 IO 线程,这种异步 IO 的方式使得 IO 线程需要直接处理的任务很简单,即完成 IO 后的一些收尾处理并发出 IO 完成通知,如果操作系统不支持异步 IO,此时 IO 线程就需要完成实际的 IO 操作。

调度线程

调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:

  1. 检查系统级的时间触发器,如果满足触发条件则生成任务加到任务工作线程的任务队列由任务工作线程执行;
  2. 清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
  3. 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
  4. 自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI 参数设置的自动检查点执行间隔定期执行检查点操作;
  5. 会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
  6. 必要时执行数据更新页刷盘;
  7. 唤醒等待的工作线程。

日志 FLUSH 线程

任何数据库的修改,都会产生重做 REDO 日志,为了保证数据故障恢复的一致性,REDO 日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的 REDO 日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知 FLUSH 线程进行日志刷盘。由于日志具备顺序写入的特点,比数据页分散 IO 写入效率更高。日志 FLUSH 线程和 IO 线程分开,能获得更快的响应速度,保证整体的性能。DM8 的日志 FLUSH 线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了 IO 次数,进一步提高了性能。

如果系统配置了实时归档,在 FLUSH 线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果配置了本地归档,则生成归档任务,通过日志归档线程完成。

日志归档线程

日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。

将日志 FLUSH 线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离 FLUSH 线程来做,如果放在 FLUSH 线程中一起做会严重影响系统性能。

日志 APPLY 线程

在配置了数据守护的系统中,创建了一个日志 APPLY 线程。当服务器作为备库时,每次接收到主库的物理 REDO 日志生成一个 APPLY 任务加入到任务队列,APPLY 线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。

定时器线程

在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份;或者是在某个时间段内反复进行某种操作等。定时器线程就是为这种需求而设计的。

通常情况下,DM Server 需要进行定时操作的事件主要有以下几种:

  1. 逻辑日志异步归档;
  2. 异步归档日志发送(只有在 PRIMARY 模式下,且是 OPEN 状态下);
  3. 作业调度。

定时器线程启动之后,每秒检测一次定时器链表,查看当前的定时器是否满足触发条件,如果满足,则把执行权交给设置好的任务,如逻辑日志异步归档等。

默认情况下,达梦服务器启动的时候,定时器线程是不启动的。用户可以设置 dm.ini 中的 TIMER_INI 参数为 1 来设置定时器线程在系统启动时启动。

MAL 系统相关线程

MAL 系统是 DM 内部高速通信系统,基于 TCP/IP 协议实现。服务器的很多重要功能都是通过 MAL 系统实现通信的,例如数据守护、MPP、远程日志归档等。MAL 系统内部包含一系列线程,有 MAL 监听线程、MAL 发送工作线程、MAL 接收工作线程等。

其他线程

事实上,DM 数据库系统中还不止以上这些线程,在一些特定的功能中会有不同的线程,例如回滚段清理 PURGE 线程、审计写文件线程等

线程信息的查看

为了增加用户对 DM 数据库内部信息的了解,以及方便数据库管理员对数据库的维护,DM 提供了很多动态性能视图,通过它们用户可以直观地了解当前系统中有哪些线程在工作,以及线程的相关信息。

相关动态视图如下:

名称说明
V$LATCHES记录当前正在等待的线程信息
V$THREADS记录当前系统中活动线程的信息
V$PROCESS记录服务器进程信息

版本介绍

版本区别

开发版

开发版提供除集群功能外完整的 DM8 功能,以及配套的迁移、监控调试工具,支持 TB 级数据量,支持多用户并发访问能力,适合中、小型应用场景。仅供开发者用于学习、测试、开发用途,1 年免费试用期。

标准版

DM 标准版是为政府部门、中小型企业及互联网/内部网应用提供的数据管理和分析平台。它拥有数据库管理、安全管理、开发支持等所需的基本功能,支持多用户并发访问等。该版本以其前所未有的易用性和高性价比,为政府或企业提供支持其操作所需的基本能力,并能够根据用户需求完美升级到企业版。

企业版

DM 企业版是伸缩性良好、功能齐全的数据库,无论是用于驱动网站、打包应用程序,还是联机事务处理、决策分析或数据仓库应用, DM 企业版都能作为专业的服务平台。DM 企业版支持多 CPU,支持 PB 级海量数据存储和大量的并发用户,并为高端应用提供了数据复制、数据守护等高可靠性、高性能的数据管理能力,完全能够支撑各类企业应用。

安全版

DM 安全版拥有企业版的所有功能,并重点加强了其安全特性,引入强制访问控制功能,采用数据库管理员 (DBA)、数据库审计员 (AUDITOR)、数据库安全员 (SSO)、数据库对象操作员 (DBO) 四权分立安全机制,支持 KERBEROS、操作系统用户等多种身份鉴别与验证,支持透明、半透明等存储加密方式以及审计控制、通信加密等辅助安全手段,使 DM 安全级别达到 B1 级,适合于对安全性要求更高的政府或企业敏感部门选用。

版本获取

在线服务平台提供开发版下载,请根据自己的操作系统和 CPU 类型选择相匹配的安装包进行下载

如果在线服务平台提供的版本无法满足需求,需其他平台下对应的安装包,可通过以下两种方式申请:

  1. 拨打达梦咨询热线 400 991 6599 直接获取;
  2. 联系项目对应的达梦商务人员获取。

服务规范

以“客户至上,服务第一”的理念为核心,以提高客户满意度为己任。为客户提供标准,专业,规范的服务。

技术支持:dmtech@dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值