thrift性能测试并分析

面试——HTTP 和 Thrift HTTP 和 Thrift 都是用于网络通信的协议,它们各有优劣,适用于不同的场景。 阅读详情

一、测试结果分析:

经过测试发现,在性能方面thrift远远高于http协议

简单比较一下:

1、http协议简单,可以通过json(xml数据格式,数据比较臃肿,解析麻烦,不建议使用)的方式传送数据,而thrift需要设计thrift协议比http复杂。

2、thrift目前文档比较少,在官网只有简单的使用说明文档,http文档一搜一大片。

3、thrift是基于socket,通过tcp协议实现

(a)每次连接、关闭会比较耗性能

(b)客户端主动关闭的Socket端会进入TIME_WAIT状态,并且TIME_WAIT状态一般维持在1-4分钟。而http是无连接、无状态的协议。

 

通过以上比较和测试,如果基于复杂程度比简单方面使用http,如果基于性能方面建议使用thrift:

 

在使用thrift方法两点需要注意:

1、server端需要封装一个模块,控制thrift最大连接数

2、client端创建连接池的方式,使用长连接。否则每次请求建立、关闭连接,(a)会有1-4分钟的TIME_WAIT状态,会包连接不上的错误,(b)耗性能

 

二、测试数据以及方法

测试环境服务器采用公司linux服务器:

服务器:thrift和http的服务器端均采用nodeJs实现

客户端:

thrift测试方法,在本地用java实现多线程模拟发送请求,发送数据{'uid':1,'name':'test','age':25,'desc':'abcdssssssssssssssssssdddddddddddddfffffff'}

http的测试采用ab测试方法,不传递任何参数

 

1、总共发送10000 request 100client并发

(a)thrift:执行五次时间如下:

681 ms; 543 ms; 604 ms; 542 ms; 576 ms;平均时间:589.2ms ,16972 request/s

 

(b)http:ab -n 10000 -c 100 http://localhost:9090/

taken for tests:1.059s; 1.186s; 1.311s; 1.195s;1.361s平均时间:1.2224s,8181 request/s

 

2、总共发送10000 request 200client并发

(a)thrift执行五次时间如下:

570 ms; 582 ms; 659 ms; 570 ms; 621 ms平均时间:600.4ms, 16656 request/s

 

(b)http:ab -n 10000 -c 200 http://localhost:9090/

taken for tests:1.139s; 1.153s;1.142s; 1.118s;1.143s;平均时间:1.139,8780 request/s

 

3、总共发送100000 request 100client并发

(a)thrift执行五次时间如下:

3060 ms; 3414 ms;2821 ms; 3915 ms; 3143 ms;平均时间:3270.6ms,30575 request/s

 

(b)http:ab -n 100000 -c 100 http://localhost:9090/

taken for tests:11.787s;12.115s; 12.051s;11.878s; 11.954s 平均时间:11.957s,8363 request/s

 

4、总共发送100000 request 200client并发

(a)thrift执行五次时间如下:

3481 ms; 3737 ms; 3276 ms; 3145 ms;3046 ms平均时间:3337ms ,29967 request/s

 

(b)http:ab -n 100000 -c 200 http://localhost:9090/

taken for tests:12.353s;11.808s;11.926s;13.174s; 12.254s 平均时间:12.303s, 8128 request/s


Thrift服务调用错误?`oneway`方法的响应处理陷阱 摘要:本文深入剖析了Apache Thrift中oneway方法的使用风险与优化策略。通过真实案例揭示了数据丢失和顺序错乱两大核心问题,对比分析了同步与oneway调用的性能差异(3倍吞吐量提升但存在0.03%消息丢失率)。提出企业级解决方案包括带指数退避的重试机制、批量确认协议和分区序列号技术,并给出典型故障的检测脚本与压测配置。最佳实践表明,在日志上报等场景下,结合TFramedTransport和客户端重试可安全发挥oneway的高性能优势。 阅读详情

相关推荐

Apache Jmeter进阶-RPC服务压测

在上一节Apache Jmeter入门中,我们简单介绍了Jmeter的使用方法。 本节中,我们将着重介绍Jmeter压测,以Thrift RPC为例子进行讲解。1、准备我们依然采用Thrift RPC这节中的RPC服务作为服务端程序并运行。2、Jmeter测试类编写2.1 Jmeter测试类简介 新建一个普通的Java工程 添加JMeter Maven依赖。 <dependency> <g

唐影若凡的专栏 1702

Thrift的性能测试和压力测试实践

1.背景介绍 Thrift是一个高性能的跨语言RPC框架,它可以让我们轻松地在不同的编程语言之间进行通信,实现服务器和客户端之间的通信。Thrift的性能和稳定性对于构建高性能的分布式系统来说非常重要。在实际应用中,我们需要对Thrift的性能进行测试和压力测试,以确保其满足系统的性能要求。 在本文中,我们将讨论如何对Thrift进行性能测试和压力测试,以及如何解决可能遇到的一些问题。我们将从...

AI天才研究院 1339

揭秘Thrift:高效、可扩展的跨语言通信框架(二)

Thrift作为一种高效、可扩展的跨语言通信框架,为不同编程语言之间的通信提供了便捷而强大的解决方案。通过揭示Thrift的内部工作原理和设计思路,我们了解到它是如何实现快速、灵活和可靠的数据交互的。在实际项目中,Thrift的应用场景广泛,无论是在大型分布式系统还是微服务架构中,Thrift都能发挥重要作用。通过本文的阅读,我们深入探索了Thrift的世界,发现了它背后的无限潜力和价值。它不仅可以帮助我们解决不同语言系统间的通信问题,还能提高系统性能和可扩展性。

凛鼕将至的博客 1615

thrift示例及性能测试

1     简介 Thrift是一个跨语言的服务部署框架,最初由facebook开发用做系统内各语言之间的RPC(Remote Procedure Call Protocol,远程过程调用协议通信),2007年由facebook贡献到apache基金,08年5月进入apache孵化器。Thrift通过一个中间语言IDL(interface description language, 接口定义

liu_lin_sp的博客 7831

RPC-TEST:测试gRPC和Thrift的性能。 所有服务均由Java,Scala和Golang实施为HelloWorld

简单的Thrift和gRPC性能测试 使用一个简单的“ helloworld”原型来测试节俭和gRPC。 所有服务器和客户端均由Golang,Java和Scala实现 测试结果如下(毫秒/ 10000次呼叫)。 第一个值使用一个客户端测试服务器,第二个值使用20个客户端同时测试。 高朗 Java Scala 节约 470/231 404/381 387/355 gRPC 1375/970 4478/4205 4733/448

WPF实战:HelixToolkit 3D图形开发入门指南

本文详细介绍了如何使用HelixToolkit在WPF中进行3D图形开发,从环境搭建到创建第一个3D程序(如彩色立方体),再到进阶技巧和常见问题排查。通过实战案例和性能优化建议,帮助开发者快速掌握3D场景构建和模型导入技术,提升开发效率。

weixin_29197051的博客 758

分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较

分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(非开源)有竞争关系,导致dubbo团队已经解散(参见http://

青山师 3万+

STM32F103C8T6通过ESP8266连接阿里云物联网平台(附代码)

STM32F103C8T6连接阿里云物联网平台(1)—阿里云lot Studio控制 Web开发 分享一下自己使用stm32f103c8t6通过ESP_01模块连接阿里云物联网平台,实现温湿度上传和控制命令下达的过程,能力有限,用的是最简单的方法,如有错误,多多担待。 一、硬件选型 1、 stm32f103c8t6 2、ESP_01 wifi模块 3、其他 二、硬件连接 WSP_01 STM32F103C8T6 RXD PA2 TXD PA3 RES PA4 VCC 3.3

weixin_A13253323604 3万+

thrift性能测试数据

  环境: 8核 12GB内存   服务端代码: MessageBrokerService.Iface iface = SpringContext.getBean(MessageBrokerService.Iface.class); TServerTransport serverTransport = new TServerSocket(port); MessageB...

408

图生文【学习中】

图生文:提供图像,把图像对应的信息用文本描述出来

qq_19072921的博客 1787

RK3568 HDMI输出调试:分辨率切换与EDID解析

厂商信息(Vendor ID)显示器型号(Product ID)支持的分辨率列表色彩特性音频支持情况检查项方法HPD 信号EDID 读取当前模式TMDS 时钟PHY 状态。

小灰灰的博客 1481

java thrift TSimpleServer TNonblockingServer THsHaServer TThreadedSelectorServer TThreadPoolServer比较

https://github.com/m1ch1/mapkeeper/wiki/Thrift-Java-Servers-Compared This article talks only about Java servers. See this page if you are interested in C++ servers. Thrift is a cross-languag

常思考->有目标->重实践->善反思 2144

微信删除的聊天记录怎么恢复(2024年最新攻略合集)

随着微信对我们生活中方方面面的渗透,微信已然从一款简单的社交软件过渡成为现时代的一种生活方式,而微信中的聊天记录就是我们和朋友之间历程的最好证明。对此,今天我们来聊聊微信删除的聊天记录怎么恢复的问题。

m0_70960708的博客 944

protobuf和thrift对比

本文转自:http://liuchangit.com/development/346.html 数据类型 protobuf thrift protobuf thrift protobuf thrift protobuf thrift double double float

xqy1522的专栏 2万+

将 SAP BTP ABAP environment 与 SAP S/4HANA Cloud 公有云版集成:从架构理念到落地实战

本文探讨了在SAP云环境中实现ABAP扩展应用与S/4HANA Cloud系统集成的技术方案。通过建立标准化的远程通信通道,开发者可在SAP BTP ABAP环境中开发扩展应用,同时安全访问S/4HANA Cloud的核心业务数据和服务。文章详细介绍了整体架构设计、开发实现步骤(包括定义通信场景、生成服务消费模型和编写调用代码)以及管理员在S/4HANA侧的配置工作(创建通信安排和技术用户)。通过一个业务伙伴自助注册平台的案例,展示了如何在不修改标准系统的情况下实现云扩展,体现了SAP"干净核心&

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 238

SpringBoot DDoS防护:限流与验证全面指南

SpringBoot应用DDoS防护摘要 本文介绍了SpringBoot应用防护DDoS攻击的方案。DDoS攻击通过分布式请求耗尽服务器资源,导致服务不可用、成本激增等风险。防护需遵循分层防御、弹性设计等原则。 核心方案包括: 令牌桶限流:使用Guava RateLimiter控制请求速率 滑动窗口算法:通过Redis+Lua实现精确的分布式限流 微服务集成:利用Spring Cloud Gateway统一管理API限流 实施建议: 关键接口默认添加限流保护 监控系统实时警报异常流量 结合WAF等多层防护措

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 2486

MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明

MessagePack, Protocol Buffers跟Thrift序列化框架原理和比较说明 www.MyException.Cn   发布于:2014-04-09 21:52:36   浏览:0次 0 MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明   第1部分 messagepa

剑飞的专栏 1388

定位教程7---旋转中心标定之方法二

手算相机相对机器人关系

Quintin 6230

最完整Thrift服务压测指南:用Locust模拟10万并发请求

Thrift作为跨语言的远程过程调用框架,在分布式系统中扮演着关键角色。本文将为你提供一套完整的Thrift服务压测方案,帮助你使用Locust工具轻松模拟10万级并发请求,全面评估系统性能。 ## Thrift架构概览:理解性能测试的基础 在进行压测前,先了解Thrift的分层架构有助于我们设计更精准的测试方案。Thrift采用多层架构设计,从底层到上层依次为: [![Thrift分层架构

gitblog_00896的博客 1224

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

分布式系统中的必备良药 —— RPC

阅读目录 前言 成熟的解决方案 剖析 性能测试 结语 一、前言   在上一篇分布式系统系列中《分布式系统中的必备良药 —— 服务治理》中阐述了服务治理的一些概念,那么与服务治理配套的必然会涉及到RPC框架。在当前互联网的大背景下,RPC的运用应该大家或多或少都有涉及,国内外的RPC框架也是百花齐放。那么各个RPC框架各自有什么特点,另外RPC的核心点又是哪些...

weixin_30273501的博客 83

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

.net RPC框架选型

近期开始研究分布式架构,会涉及到一个最核心的组件:RPC(Remote Procedure Call Protocol)。这个东西的稳定性与性能,直接决定了分布式架构系统的好坏。RPC技术,我们的产品中其实早就已经应用。但是产品中经常出现访问失败等错误,在没有细致研究的情况下,大家怀疑是选用的RPC组件不稳定引起。今天也借这个机会给这个组件正名一下吧。 选型的思路很简单,先bai...

weixin_30363509的博客 276

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

(中级篇 NettyNIO编解码开发)第六章-编解码技术

基于Java提供的对象输入/输出流ObjectlnputStream和ObjectOutputStream,可以直接把Java对象作为可存储的字节数组写入文件,也可以传输到网络上。对程序员来说,基于JDK默认的序列化机制可以避免操作底层的字节数组,从而提升开发效率。Java序列化的目的主要有两个: 1.网络传输2.对象持久化由于本书主要介绍基于Netty的NIO网络开发,所以我们重点关注网络传输...

weixin_33910460的博客 197

如何用Bender快速实现高并发负载测试?完整入门指南与最佳实践

Bender是一款简单易用的负载测试库,专为创建高并发负载测试应用而设计。它支持HTTP、DNS、TFTP等多种协议,提供两种核心负载测试模式,帮助开发者轻松构建专业的性能测试工具。无论是新手还是有经验的测试工程师,都能通过Bender快速实现可靠的负载测试方案。 ## 🚀 为什么选择Bender进行负载测试? Bender作为轻量级负载测试框架,具有三大核心优势: ### 1. 多协议支

gitblog_01085的博客 470

benchmark-thrift: 性能测试利器

benchmark-thrift: 性能测试利器 一、项目介绍 benchmark-thrift 是一款专为测试Thrift应用程序而设计的性能检测工具,它被设计成开箱即用,功能强大且使用简便。该工具支持多个Thrift版本以及各种TProtocol和TTransport类型,提供并发和吞吐量两种压力模式供选择。 特点包括: 一键下载:无需繁琐配置,下载最新版本即可在命令行下立即运行。 多版本兼...

gitblog_00811的博客 1589
上一篇: redis持久化方式
下一篇: redis持久化性能测试
技术宝哥
博客等级 码龄16年 331粉丝 222原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值