ELK第五篇:使用JavaAPI6.0.0操作-DocumentAPIs

ELK搭建及Java程序接入 环境 centos7.5 下载 官网下载Elasticsearch、Logstash、Kibana https://www.elastic.co/ https://www.elastic.co/cn/downloads/ 我下载的都是7.1.1版本,最好统一版本 (注意,这几个都是试用版,过一段时间会过期,如果需要长期使用,得下载oss版本) 点击产品下面的下载按钮(有的在... 阅读详情

说明

1、TransportClient
2、JestClient
3、RestClient

还有种是2.3中有的NodeClient,在5.5.1之后就没有了。还有种是spring-data-elasticsearch

elasticsearch安装的不同服务器版本使用的JavaAPI也需要和其版本相对应,因为它的每个版本的API变动太大,并且不支持向前兼容,最好是直接使用相对应的版本。
本文相对应的版本是
elasticsearch6.0.0

7.0中TransportClient警告
We plan on deprecating the TransportClient in Elasticsearch 7.0 and removing it completely in 8.0. Instead, you should be using the Java High Level REST Client, which executes HTTP requests rather than serialized Java requests. The migration guide describes all the steps needed to migrate.
我们计划在Elasticsearch 7.0中弃用TransportClient并在8.0中完全删除它。 相反,您应该使用Java高级别REST客户端,它执行HTTP请求而不是序列化的Java请求。 迁移指南介绍了迁移所需的所有步骤。【更新时间:2019-05-24,感谢评论区用户名guofangyao的提醒】
因此推荐后面直接使用REST方式进行调用,不在推荐TransportClient方式

maven

引入相关的依赖:
看清楚版本号要对应,否则会报错,特别是对client的链接

<!-- elasticsearch -->
		<dependency>  
            <groupId>org.elasticsearch</groupId>  
            <artifactId>elasticsearch</artifactId>  
            <version>6.0.0</version>
        </dependency>
        <dependency>  
            <groupId>org.elasticsearch.client</groupId>  
            <artifactId>transport</artifactId>  
            <version>6.0.0</version>
        </dependency>    
        <dependency>  
            <groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
            <version>1.2.8</version>  
		</dependency>

java使用API

import java.io.IOException;
import java.net.InetAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import org.elasticsearch.action.bulk.BackoffPolicy;
import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.bulk.BulkProcessor.Listener;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.script.Script;
import org.elasticsearch.transport.client.PreBuiltTransportClient;

/***********
 * 
 * 版本elasticsearch6.0.0
 * Document APIs的使用
 * 
 * @author bamboo
 *
 */
public class ElkMain {

	
	private static TransportClient client;
	
	 public static void getClient() {
		// TODO Auto-generated method stub
		 try {  
		      
		      //设置集群名称  
		  
		      Settings settings = Settings.builder().put("cluster.name", "my-application").build();  
		      //创建client  
		      //@SuppressWarnings("resource")  
		      client = new PreBuiltTransportClient(settings)  
		              .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.0.91"), 9300));  
		      
		      
		      //写入数据  
		     // createDate(client);  
		      //搜索数据  
//		      GetResponse response = client.prepareGet("accounts", "person", "1").execute().actionGet();  
//		      //输出结果  
//		      System.out.println(response.getSource());  
		        
		      //关闭client  
		      //client.close();  
		  } catch (Exception e) {  
		      e.printStackTrace();  
		  }  
	}
	
	
	
	
	/** 
	   * 插入单条数据 
	   * {"account_number":44,"balance":34487,"firstname":"Aurelia","lastname":"Harding","age":37,"gender":"M","address":"502 Baycliff Terrace","employer":"Orbalix","email":"aureliaharding@orbalix.com","city":"Yardville","state":"DE"}

	   * @param client 
	   */  
   public static void addDate(){
    Map<String,Object> map = new HashMap<String, Object>();  
    map.put("account_number", 45);  
    map.put("balance", 34487);  
    map.put("firstname", "Aurelia");  
    map.put("lastname", "Harding");  
    map.put("age", 37);  
    map.put("gender","M");  
    map.put("address","浙江省杭州市江干区人民公园中国梦");  
    map.put("gender","M");  
    map.put("employer","小李");
    map.put("email","aureliaharding@orbalix.com");
    map.put("city","Yardville");
    map.put("state","DE");  
    
    
    try {  
	    //json格式
    	// String json=JSON.toJSONString(map);
    	//IndexResponse response = client.prepareIndex("accounts", "person","47").setSource(json, XContentType.JSON).get();
	   //map格式
        IndexResponse response = client.prepareIndex("accounts", "person","45")  //UUID.randomUUID().toString()
                   .setSource(map).execute().actionGet();  
        System.out.println(response.toString());  
        System.out.println("写入数据结果=" + response.status().getStatus() + "!id=" + response.getId());  
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
   } 
	
   
   
   
   //获取单条数据
   public static void getDataByID(String id) {
		// TODO Auto-generated method stub
		 try {  
		      
		      //搜索数据  
		      GetResponse response = client.prepareGet("accounts", "person", id).execute().actionGet();  
		      //输出结果  
		      System.out.println(response.getSource());  
		        
		      //关闭client  
		      //client.close();  
		  } catch (Exception e) {  
		      e.printStackTrace();  
		  }  
	}
   
   /**
    * 删除单条记录 delete api
    * 
    */
   public static void deleteById(String id) {
       DeleteResponse response = client.prepareDelete("accounts", "person", id)
               .get();
       String index = response.getIndex();
       String type = response.getType();
       String rid = response.getId();
       long version = response.getVersion();
       System.out.println(response.toString());  
       System.out.println(index + " : " + type + ": " + rid + ": " + version);
   }
	
   
   
   
   /**
    * 测试更新 update API
    * 使用 updateRequest 对象
    * @throws Exception 
    */
   public static void update(String id)  {
		UpdateRequest updateRequest = new UpdateRequest();
      
      //client.prepareUpdate("accounts", "person", "1")和下面相同
//	       updateRequest.index("accounts");
//	       updateRequest.type("person");
//	       updateRequest.id(id);
//	       updateRequest.doc(XContentFactory.jsonBuilder()
//	               .startObject()
//	               // 对没有的字段添加, 对已有的字段替换
//	               .field("employer", "小李子22")
//	                .field("gender", "M")
//	               .endObject());		
 //UpdateResponse response = client.update(updateRequest).get();
      
      // 使用Script对象进行更新
//    UpdateResponse response = client.prepareUpdate("accounts", "person", id)
//		     .setScript(new Script("ctx._source.employer = \"小李子22\""))
//		     .get();
    
    // 使用XContFactory.jsonBuilder() 进行更新
     UpdateResponse response = null;
		try {
			response = client.prepareUpdate("accounts", "person", id)
			         .setDoc(XContentFactory.jsonBuilder()
			                 .startObject()
			                     .field("employer", "小李子333")
			                 .endObject()).get();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    
    // 使用updateRequest对象及script
//     UpdateRequest updateRequest = new UpdateRequest("accounts", "person", id)
//             .script(new Script("ctx._source.gender=\"male\""));
//     UpdateResponse response = client.update(updateRequest).get();
      
      
     
      
      // 打印
      String index = response.getIndex();
      String type = response.getType();
      String rid = response.getId();
      long version = response.getVersion();
      System.out.println(response.toString());  
      System.out.println(index + " : " + type + ": " + rid + ": " + version);
   }
   
   
   /**
   * 测试upsert方法
   * 查询条件, 查找不到则添加生效
   * @throws Exception 
   * 
   */
  public static void upSet(String id) {
      try {
		// 设置查询条件, 查找不到则添加生效
		  IndexRequest indexRequest = new IndexRequest("accounts", "person", id)
		      .source(XContentFactory.jsonBuilder()
		          .startObject()
		              .field("name", "qergef")
		              .field("gender", "malfdsae")
		          .endObject());
		  // 设置更新, 查找到更新下面的设置
		  UpdateRequest upSet = new UpdateRequest("accounts", "person", id)
		      .doc(XContentFactory.jsonBuilder()
		              .startObject()
		                  .field("user", "wenbronk")
		              .endObject())
		      .upsert(indexRequest);
		  
		  client.update(upSet).get();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (ExecutionException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
      
      
  }
  
   /**
   * 测试multi get api
   * 从不同的index, type, 和id中获取
   */ 
  public static void testMultiGet() {
      MultiGetResponse multiGetResponse = client.prepareMultiGet()
      .add("twitter", "tweet", "1")
      .add("accounts", "person",  "6", "13", "18")//因为我数据里面刚好有这几个ID,根据你自己的情况设置
      .add("index", "type", "foo")
      .get();
      
      for (MultiGetItemResponse itemResponse : multiGetResponse) {
          GetResponse response = itemResponse.getResponse();
          if (response!=null&&response.isExists()) {
              String sourceAsString = response.getSourceAsString();
              System.out.println(sourceAsString);
          }
      }
  }
  
  
  
  
  
  /**
   * bulk 批量执行
   * 一次查询可以update 或 delete多个document
   */
  public static void testBulk()  {
      try {
		BulkRequestBuilder bulkRequest = client.prepareBulk();
		  bulkRequest.add(client.prepareIndex("accounts", "person", "50")
		          .setSource(XContentFactory.jsonBuilder()
		                  .startObject()
		                      .field("user", "kimchy")
		                      .field("postDate", new Date())
		                      .field("message", "trying out Elasticsearch")
		                  .endObject()));
		  bulkRequest.add(client.prepareIndex("accounts", "person", "51")
		          .setSource(XContentFactory.jsonBuilder()
		                  .startObject()
		                      .field("user", "kimchy")
		                      .field("postDate", new Date())
		                      .field("message", "another post")
		                  .endObject()));
		  BulkResponse response = bulkRequest.get();
		  System.out.println(response.toString());
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
  }
   
  
  
  /**
   * 使用bulk processor
   * @throws Exception 
   */
  public static void testBulkProcessor() throws Exception {
      // 创建BulkPorcessor对象
      BulkProcessor bulkProcessor = BulkProcessor.builder(client, new Listener() {

		@Override
		public void beforeBulk(long executionId, BulkRequest request) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void afterBulk(long executionId, BulkRequest request,
				BulkResponse response) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void afterBulk(long executionId, BulkRequest request,
				Throwable failure) {
			// TODO Auto-generated method stub
			
		}
         
      })
      // 1w次请求执行一次bulk
      .setBulkActions(10000)
      // 1gb的数据刷新一次bulk
      .setBulkSize(new ByteSizeValue(1, ByteSizeUnit.GB))
      // 固定5s必须刷新一次
      .setFlushInterval(TimeValue.timeValueSeconds(5))
      // 并发请求数量, 0不并发, 1并发允许执行
      .setConcurrentRequests(1)
      // 设置退避, 100ms后执行, 最大请求3次
      .setBackoffPolicy(
              BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3))
      .build();
      
      // 添加单次请求
      bulkProcessor.add(new IndexRequest("accounts", "person", "50"));
      bulkProcessor.add(new DeleteRequest("accounts", "person", "51"));
      
      // 关闭
      bulkProcessor.awaitClose(10, TimeUnit.MINUTES);
      // 或者
      bulkProcessor.close();
  }
   
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		getClient();
		//addDate();
		//getDataByID("44");
		//deleteById("45");
//		update("44");
//		getDataByID("44");
		
//		upSet("46");//查找设置
//		getDataByID("46");
		
//		testMultiGet();
		
		//testBulk();//批量执行
		//getDataByID("51");
		
		
		testBulkProcessor();//批量处理,少于1w次不会执行
		getDataByID("51");
		
	}

}

参考文档

官方API6.0.0文档中文版本
Java API [6.0] » Document APIs
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs.html

Java API 6.0(中文版),开发手册 Java 官方(中文版)API 6.0 版本,需要的小伙伴不要错过哦!! 立即下载

相关推荐

Java API技术文档6.0中文版

API(应用程序编程接口)文档包含对应于导航栏中的项目的页面 版本:JavaTM 2 Platform Standard Edition 6 API 开发人员文档 除此下载打开为空白解决方案: 右键属性-勾选解除安全锁定,再次打开即可用。

Elasticsearch Java API 的使用(4)—更新索引(update & upset)与 Bulk的批量更新

Java更新索引public class EsUpdate{ public void updateIndex(TransportClient client){ Date time = new SimpleDateFormat(&amp;amp;quot;yyyy-MM-dd HH:mm:ss&amp;amp;quot;) .parse(&amp;amp;quot;2016-7-21 00:

zx711166的博客 8982

python特征选择pso_【来点干货】机器学习中常用的特征选择方法及非常详细的Python实例...

花费了很长时间整理编辑,转载请联系作者授权,违者必究。特征选择(Feature selection)是在构建预测模型的过程中减少输入变量的一个过程。它是机器学习中非常重要的一步并在很大程度上可以提高模型预测精度。这里我总结了一些机器学习中常见的比较有用的特征选择方法并附上相关python实现code。希望可以给大家一些启发。首先,我们为什么要进行特征选择呢?它有以下几个优点:减少过拟合:冗余数据常...

weixin_39927158的博客 1161

Java整合ELK实现日志收集 之 Elasticsearch、Logstash、Kibana

Elasticsearch:用于存储收集到的日志信息Logstash:用于收集并处理日志,将日志信息存储到Elasticsearch里面Kibana:通过Web端的可视化界面来查看日志(数据可视化)Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的存储库中。一、安装 Docker Compose 环境Docker Compose的安装# docker compose安装步骤设置权限。

myStyle的博客 4211

Multisim新手必看:从零搭建数字时钟仿真电路(附完整原理图)

本文详细介绍了如何使用Multisim从零开始搭建数字时钟仿真电路,涵盖晶振电路设计、计数电路实现、校时功能配置等关键步骤。通过完整的原理图和实用技巧,帮助新手快速掌握Multisim仿真设计,实现精准的数字时钟功能。

ios99的博客 328

第44节:cesium 大雾效果(cesium自带)(含源码+视频)

cesium 大雾效果(cesium自带)

qq_29384639的博客 1702

Java开发 - ELK初体验

ELK是如今比较流行的一套框架,主要用于日志的采集保存和查询。线上情况,我们不能通过控制台来实时查看,但却可以通过日志输出来定位问题,查看必要的信息。如果保存成文件,也必然是极庞大的体量,并不适合我们去翻看,查找信息,这才有了ELH,其实对于ELK,大家也并不陌生,其中的E,就是我们前段时间学习的ES,全名Elasticsearch,中文名:全文搜索引擎。是不是很惊喜和意外?所以当然,L和K也是两个单独的系统,他们统称为ELK,下面,我们将逐一介绍这三个东西是什么。如果自己做,还是推荐官方的做法。

CodingFire的博客 3325

innovus:给channel加soft blockage

dbGet [dbGet top.fplan.pBlkgs.name finishfp_place_blkg_* -p].boxes就可以获得channel坐标。意思是给30um以下的channel加soft blk,至于channel的坐标,通过抓取该soft blk去获取,比较容易。工具自己加入的placement blockage命名上叫finishfp_place_blkg_*ICC2中有给channel自动加soft blockage的命令,相应的innovus也有类似的命令,我们可以使用。

m0_61544122的博客 480

JAVA进阶之路-ELK搭建以及使用

首先说下为啥要写ELK,刚进公司,因为公司以前有项目说是缺少日志系统,需要搭建一个ELK,所以就开始了我的摸坑之旅。下面进入正文。 ELK需要支持的技术有以下: 1、Elasticsearch(以下简称为es) 主要用于存入日志以及查询日志,为啥不用mysql存储查询呢,别问,问就是效率问题。(这个要说的太多,大家自己去慢慢查资料吧) 2、Log...

阿猪的博客 1320

一文整理深度学习【深度学习linux的docker+pytorch+cuda+nvidia-docker+vscode配置】

docker+pytorch+cuda+nvidia-docker+vscode

Edward的博客 1335

基于STM32、HAL库的RN8209D电能计量芯片驱动程序设计

/ 假设电压互感器变比为220V:0.5V,电流互感器变比为20A:5mA。// 电压ADC原始值。// 电流ADC原始值。// 有功功率(W)// 电能(kWh)

corlin6688的博客 469

ELK常用API使用方法

以下ELK系列文章参考自http://www.tianyiqingci.com/ 总目录: Monitor API ElasticSearch聚合分析API Elasticsearch信息检索API ElasticSearch索引管理API 附录 Monitor API Cluster health 查看集群健康状态接口。 http://localhost:9200/_cluster/health...

weixin_30384031的博客 3316

【ComfyUI】Wan2.2 Animate 背景保留动作迁移视频生成

本文介绍了一个基于ComfyUI的高精度视频生成工作流"Wan2.2 Animate",该系统融合动作捕捉、图像拼接和LoRA加权等技术,能自动识别人脸并完成精准动作迁移,同时保持背景稳定。工作流采用模块化设计,包含输入提取、图像融合、模型加载等关键节点,核心模型Wan2.2-Animate-14B支持fp8精度与BlockSwap控制。流程分为图像输入、动作提取、多图合成等五个阶段,通过文本提示编码器和图像语义编码器实现语义驱动的动作生成,最终输出高质量视频,适用于虚拟形象驱动和

Mr数据杨 2258

Spring Data Elasticsearch(java操作ELK)

uris: http://192.168.8.128:9200 # ES服务器所在位置。集群多节点地址用逗号分隔。默认http://localhost:9200。# data: # ElasticsearchTemplate客户端配置。# cluster-nodes: 192.168.137.128:9300 # ES集群多节点地址。多个地址用逗号分隔。# cluster-name: docker-cluster # ES集群的名称。# 注意: 地址一定不要有末尾字符 '/'

weixin_53455615的博客 1885

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java Spring Cloud XXII 之 ELK

Java Spring Cloud XXII 之 ELK

letterljhx的博客 494

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

elasticsearch-updateRequest的应用

#step1:插入数据,全部更新之前的 curl -X PUT 'localhost:9200/test/type1/1' -H 'Content-Type: application/json' -d '{ "name":"zhangsan", "age":10, "sex":"女", "phone":"13456789", "adress":"" }'#...

wen‘s blog 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Elasticsearch Document Update API详解、原理与示例

   本文将详细介绍单文档(Document)的更新API,其更新API如下: public final UpdateResponse update(UpdateRequest updateRequest, RequestOptions options) throws IOException public final void updateAsync(UpdateRequest updateRe...

中间件兴趣圈 1万+

ELK在Java的使用

Bean从基础概念出发,认识了 ELK 技术栈的三个核心组件。学习了在 Java 项目中集成 ELK 的基本步骤。掌握了中级应用中日志过滤与增强以及自定义指标监控的方法。了解了高级应用中集群部署、性能优化和安全配置的要点。学习了 Kibana 可视化的相关知识。掌握了与 Spring Boot 集成的方法。了解了故障排查的常见方法和最佳实践。通过合理运用 ELK 技术栈,可以显著提升 Java 应用的可观测性和运维效率。

hqxstudying的博客 1206

elk笔记3--常用 API 命令

elk笔记x--常用命令elk笔记x--常用命令索引相关集群相关其它 elk笔记x–常用命令 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 索引相关 查看特定索引状态 http://10.120.75.102:9200/foodsite1/_stats?pretty ...

脚步不能达到的地方,眼光可以达到;眼光不能达到的地方,精神可以飞到 475

elasticsearch api中的Update API操作

You can either create an UpdateRequest and send it to the client: UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index("index"); updateRequest.type("type"); updateRequest.id("1");

春华秋实 5668

Elasticsearch学习(十一)————Java更新文档( partial Update、Upsert API)

partial Update、Upsert API————(更新文档) 1. partial Update (更新文档) 1.1. 更新文档——jsonString /** * @param : client * @description : 修改文档————jsonString */ private static ...

qq_42513284的博客 2613

ELK 基础使用 Java操作elasticseach (四)

可以看到运行代码之前customer文档索引是不存在的。再次查询,可以查询到对应文档索引了,证明代码执行成功。通过ApiPost查询可以看到如下数据文档列表。再次查询,可以看到查询失败,证明删除成功。再次查询user的id为1004的文档。可以看到之前批量插入的数据都获取到了。可以看到过滤后只剩下name字段。首先模拟插入数据以便后面的查询。可以看到sex已局部更新。可以看到该索引已被找到。可以看到条件查询的数据。可以看到数据已经更新。可以看到文档查询成功。可以看到批量插入成功。可以看到分页查询成功。

qq_50909707的博客 2856

ELK API

package com.example; import com.alibaba.fastjson.JSON; import com.example.entry.User; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkRespo

蒯厅博客 314

Java配置39-搭建ELK服务器

目录 1.服务器环境 2.安装JDK 3.安装elasticsearch 2)修改配置文件 3)修改系统参数 4)设置资源参数 5)设置用户资源参数 6)创建数据和日志目录 7)启动elasticsearch 4.安装logstash 1)安装 2)创建配置文件 2)启动logstash 5.安装kibana 1)安装 2)修改配置文件 3)启动kibana .........

JustDI0209的博客 2639

本地搭建ELK--JAVA版230226

本地搭建ELK--JAVA版230226

PASSERYFFF的博客 510
上一篇: ELK第四篇:Elasticsearch安装IK中文分词插件
下一篇: Elasticsearch资料汇总
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值