Java面试题整理6-ElasticSearch

Lucene创建索引原理

倒排索引:倒排索引是目前几乎所有支持全文检索的搜索引擎都要依赖的一个数据结构,Lucene最终会把数据做成倒排索引,其实就是数据在前,索引在后,叫做倒排索引 
  ○ 给原始数据添加索引
  ○ 将原始数据分词
  ○ 将原始数据转为小写并进行词态转换
  ○ 将分词后的数据进行排序
  ○ 将数据进行去重、索引合并形成倒排索引

ES的keyword和text区别

Elasticsearch(ES)中,keyword和text是两种常用的字段类型,用于存储文本数据。它们在分词处理和搜索行为上有所区别:

keyword类型:
keyword字段类型适用于不需要进行分词的文本数据,通常用于精确匹配、排序和聚合操作。
keyword字段将文本视为一个整体,不对其进行分词处理。输入的文本将作为一个完整的词项存储在索引中。
在搜索时,对于keyword字段,搜索的查询项必须完全匹配字段中存储的整个词项才能找到匹配的结果。
	
text类型:
text字段类型适用于需要进行全文搜索的文本数据,通常用于对文本内容进行关键词搜索。
text字段会对文本进行分词处理,将其拆分成多个词项,然后将词项存储在索引中。分词使用的是具体的分词器(Analyzer),可以根据需要选择不同的分词策略。
在搜索时,对于text字段,搜索的查询项会被分词处理后与字段中的词项进行匹配。ES会根据匹配程度和相关性进行评分,并返回相关性较高的结果。
综上所述,keyword字段适合存储需要精确匹配、排序和聚合的文本数据,而text字段适合存储需要进行全文搜索的文本数据。根据具体的业务需求,可以选择合适的字段类型来存储和搜索文本数据。在某些情况下,还可以通过使用多字段映射(Multi-fields Mapping)来同时存储原始文本(text类型)和不分词的文本(keyword类型),以便在不同的搜索场景中使用。

Lucene/ES为什么那么快(ES用到什么数据结构)

LuceneElasticsearch(ES)之所以具有高速搜索的能力,是因为它们使用了一些高效的数据结构和算法。下面是一些主要的数据结构和技术,它们有助于提高搜索性能:

倒排索引(Inverted Index):
Lucene和ES都使用倒排索引来存储和索引文档。倒排索引通过将文档中的词项映射到包含该词项的文档列表,以支持快速的全文搜索。倒排索引能够快速定位到包含搜索词的文档,而不需要遍历整个文档集合。

压缩和编码技术:
Lucene和ES在索引和存储过程中使用了多种压缩和编码技术,以减少磁盘空间的占用和网络传输的数据量。这些技术包括可变字节编码、位图压缩、块压缩等,有效地减小了索引的体积和提升了读写性能。

倒排索引段合并(Index Merging):
当索引段的数量增加时,Lucene和ES会定期进行倒排索引段的合并操作。合并操作将多个较小的索引段合并成一个更大的索引段,减少了索引段的数量,提高了搜索效率。

内存缓存和位集合并(Caching and Bitset Union):
Lucene和ES利用内存缓存技术来缓存热门的查询结果和频繁使用的数据结构,以加快搜索响应时间。另外,它们使用位集合并操作来高效地计算多个条件的交集和并集,以支持复杂的布尔查询。

倒排索引的内存映射(Memory-Mapped Inverted Index):
ES在倒排索引的存储和检索过程中使用了内存映射技术,将索引数据直接映射到操作系统的虚拟内存中,以避免了频繁的磁盘读写操作,提高了索引的读取性能。

分布式搜索和并行计算:
ES是一个分布式的搜索引擎,可以将索引和搜索请求分布到多个节点上进行处理,从而实现水平扩展和并行计算,提高了搜索的吞吐量和性能。

综上所述,LuceneElasticsearch通过优化的数据结构、压缩和编码技术、合并操作、内存缓存、位集合并、内存映射以及分布式计算等手段,实现了高效的索引和搜索功能,从而使其具有出色的性能和速度。

ES的优势

Elasticsearch(ES)作为一款开源的分布式搜索和分析引擎,具有许多优势,使其在各种应用场景中广受欢迎。以下是ES的一些主要优势:

分布式架构:ES采用分布式架构,可以将索引和查询任务分散到多个节点上进行处理。这使得ES具有高可扩展性和高吞吐量,能够处理大规模的数据和请求,并实现水平扩展。

实时搜索和分析:ES支持实时搜索和分析,可以在数据写入后立即进行搜索和分析操作。这对于实时监控、日志分析和实时业务智能等应用场景非常有用。

多种查询功能:ES提供丰富的查询功能,包括全文搜索、精确匹配、模糊查询、范围查询、布尔查询、聚合分析等。这些功能可以满足不同的搜索需求,并支持复杂的数据分析和挖掘操作。

强大的全文搜索:ES基于倒排索引实现全文搜索,支持分词、词项权重、相似度评分等功能。它具有高效的搜索速度、强大的关键词匹配能力和灵活的搜索选项,能够满足复杂的文本搜索需求。

多租户支持:ES支持多租户架构,可以将数据和查询逻辑隔离,实现多个应用或用户共享同一个集群的能力。每个租户都可以拥有独立的索引和权限控制。

弹性和容错性:ES具有自动分片和复制机制,能够将数据分散存储在多个节点上,提供数据的冗余和容错能力。当节点发生故障时,ES能够自动进行故障转移和恢复,保证系统的高可用性。

可扩展的生态系统:ES拥有一个庞大而活跃的开源社区,提供了丰富的插件和集成工具。它可以与各种数据源、流行的数据处理工具和可视化工具无缝集成,扩展了ES的功能和应用场景。

实时监控和管理:ES提供了可视化的管理界面(Kibana)和丰富的监控指标,用于监控集群的健康状态、性能指标和日志记录。这有助于及时发现问题、进行调优和管理集群。

综上所述,Elasticsearch具有分布式架构、实时搜索和分析、多种查询功能、全文搜索能力、多租户支持、弹性和容错性、可扩展的生态系统以及实时监控和管理等优势,使其成为一个功能强大、可靠性高的搜索和分析引擎。

---------------------
Elasticsearch(ES)是基于Apache Lucene构建的分布式搜索引擎,而Apache Solr是另一个独立的开源搜索平台,同样也是基于Lucene。虽然ES、LuceneSolr都提供了强大的搜索和分析功能,但它们在一些方面存在不同的优势和特点:

优势和特点:

分布式特性:ES天生支持分布式架构,具备水平扩展能力和高可用性。Solr也支持分布式部署,但需要手动配置和管理分片和复制。ES在分布式搜索和集群管理方面更加简单和易于操作。

RESTful API:ES提供了基于RESTful风格的API,使得与ES进行交互和管理变得非常简单。Solr使用基于HTTP的API,但它没有像ES那样明确地遵循RESTful原则。

数据处理和分析能力:ES在数据处理和分析方面提供了更丰富的功能。它支持实时搜索、聚合分析、地理空间搜索、自动完成和相关性评分等。Solr也提供了类似的功能,但ES在这方面的生态系统更为活跃,提供了更多的插件和集成选项。

生态系统和社区支持:ES拥有庞大且活跃的开源社区,提供了大量的文档、示例和支持资源。ES的生态系统中有许多第三方插件和工具,可以方便地与其他技术和系统集成。Solr也有一个活跃的社区,但ES的生态系统更为广泛和多样化。

多租户支持:ES在多租户方面提供了更好的支持。每个租户可以拥有独立的索引和安全控制,以实现数据的隔离和权限管理。Solr也可以支持多租户,但需要自己进行额外的配置和管理。

文档导向:ES是面向文档的搜索引擎,更适合处理半结构化和非结构化数据。它可以将数据存储为JSON格式的文档,并提供了灵活的映射和查询功能。Solr则更加面向传统的基于字段的数据模型,适用于结构化数据的搜索和分析。

-------------------------
比较Elasticsearch(ES)和Apache Lucene时,以下是一些关键方面的比较:

分布式能力:
ES:ES是一个分布式搜索引擎,可以将索引和搜索任务分散到多个节点上进行处理,具有高可扩展性和高吞吐量。
LuceneLucene是一个单机的搜索引擎库,无法直接进行分布式部署和扩展。
	
管理和配置:
ES:ES提供了自动化的集群管理和节点发现功能,简化了集群的管理和配置过程。
LuceneLucene需要手动进行配置和管理,包括索引的创建、优化和维护等操作。
	
查询和功能:
ES:ES提供了丰富的查询功能,包括全文搜索、精确匹配、模糊查询、范围查询、布尔查询、聚合分析等。还支持实时搜索和分析。
LuceneLucene也提供了强大的查询功能,包括全文搜索、精确匹配、模糊查询等,但相对于ES的聚合和分布式分析功能较为有限。
	
可扩展性:
ES:ES具有良好的可扩展性,可以通过添加更多节点来扩展集群,实现水平扩展和高吞吐量。
LuceneLucene本身是一个单机搜索引擎,无法直接扩展到多台机器,但可以通过自行编写代码和应用层面的分片来实现一定程度的扩展性。
生态系统和社区支持:

ES:ES拥有庞大而活跃的开源社区,提供了丰富的文档、示例、插件和集成工具,具有强大的生态系统支持。
LuceneLucene也有一个活跃的社区,但相对于ES来说,其生态系统的插件和集成工具较为有限。
实时性能:

ES:ES支持实时搜索和分析,可以在数据写入后立即进行搜索和分析操作,适用于实时监控和实时业务需求。

ES支持多种语言,而Luence只支持java
	
LuceneLucene的搜索和索引操作是近实时的,但无法直接支持与ES相同级别的实时性能。
需要注意的是,ES实际上是基于Lucene构建的,因此在核心搜索引擎方面,它们具有相似的功能和性能。然而,ES在分布式能力、管理和配置、实时性能以及可扩展性方面提供了更高级和更易用的功能,适合处理大规模的分布式搜索和分析场景。而Lucene则更适用于需要更细粒度控制和自定义化操作的单机搜索应用。

ES的分层结构,index下面是什么

Elasticsearch(ES)中,分层结构是如下的:

Cluster(集群):集群是由一个或多个节点(nodes)组成的集合。每个节点是运行ES实例的服务器,它们协同工作以提供高可用性、容错性和可扩展性。

Index(索引):索引是逻辑上的数据容器,用于存储和组织具有相似结构的文档。每个索引都有一个唯一的名称,并且可以根据需求创建多个索引。索引中的文档可以被搜索、分析和存储。

Type(类型):在ES 6.x及以上的版本中,一个索引可以包含多个类型(type),每个类型可以定义不同的文档结构。然而,在ES 7.x及以上的版本中,类型的概念已经被废弃,推荐使用单个索引中的多个文档类型来替代。

Document(文档):文档是ES中的基本数据单元。它是一个JSON格式的数据对象,可以包含任意的字段和值。文档被索引并存储在索引中,以便进行搜索、分析和检索。

Field(字段):字段是文档中的数据项,表示文档的属性或特征。每个字段都有一个名称和对应的值。字段可以是不同的数据类型(例如文本、数字、日期等)。

需要注意的是,ES的最新版本中(7.x及以上),索引(index)下不再包含类型(type),而是直接存储文档(document)。因此,目前的最佳实践是在一个索引中使用多个文档类型来组织数据。

讲几个ES中的查询对象:比如TermQuery

Elasticsearch(ES)中,有多种查询对象可用于构建查询语句以搜索和过滤数据。以下是一些常见的ES查询对象:

Term Query(精确匹配查询):Term Query用于精确匹配某个字段的值。它会搜索字段中与给定术语完全匹配的文档。示例:
{
  "term": {
    "field_name": "search_term"
  }
}

Match Query(匹配查询):Match Query用于根据指定的分词器对字段进行全文匹配。它会将搜索词与字段中的文本进行匹配。示例:
{
  "match": {
    "field_name": "search_text"
  }
}

Range Query(范围查询):Range Query用于根据指定的范围搜索字段的值。它可以用于数值、日期和字符串等类型的字段。示例:
{
  "range": {
    "field_name": {
      "gte": "start_value",
      "lte": "end_value"
    }
  }
}

Bool Query(布尔查询):Bool Query用于组合多个查询条件,可以使用逻辑运算符(must、should、must_not)进行查询的组合。示例:
{
  "bool": {
    "must": [
      { "term": { "field1": "value1" } },
      { "term": { "field2": "value2" } }
    ],
    "must_not": [
      { "term": { "field3": "value3" } }
    ]
  }
}

Match Phrase Query(短语匹配查询):Match Phrase Query用于匹配包含指定短语的文档。它会将搜索短语作为一个整体进行匹配。示例:
{
  "match_phrase": {
    "field_name": "search_phrase"
  }
}
这只是ES查询对象的一小部分,ES还提供了更多的查询对象和功能,如Wildcard Query(通配符查询)、Prefix Query(前缀查询)、Fuzzy Query(模糊查询)、Nested Query(嵌套查询)等。每个查询对象都有不同的语法和用法,可以根据具体需求选择适合的查询对象来构建查询语句。

你简单描述一下DSL语法

DSL(Domain-Specific Language)是Elasticsearch(ES)中使用的一种查询语法,用于构建复杂的查询语句。DSL提供了一种结构化和可读性强的方式来定义查询,并且支持多种查询类型和参数。以下是DSL语法的简要描述:

查询语句结构:
查询语句是一个JSON对象,由多个键值对组成。
每个键表示一个查询类型,对应不同的查询对象。
值是一个包含查询参数的JSON对象,用于定义具体的查询条件。
	
查询类型:
查询类型指定了不同的查询对象,如term、match、range等。
不同的查询类型具有特定的语法和参数,用于实现不同的查询功能。
	
查询参数:
查询参数是用于配置和调整查询的选项。
参数可以是单个值、数组或子查询对象,具体取决于查询类型和需求。
参数用于指定要搜索的字段、匹配的条件、范围、关系操作等。
嵌套查询:

DSL允许嵌套查询,即在一个查询中包含另一个查询。
嵌套查询可以使用bool查询或nested查询来实现复杂的查询逻辑。
	
组合查询:
DSL支持多个查询的组合,可以通过逻辑运算符(must、should、must_not)将多个查询条件进行组合。
组合查询用于构建复杂的查询逻辑,例如AND、OR和NOT等关系操作。
	
聚合查询:
DSL还支持聚合查询,用于计算和统计数据的聚合结果。
聚合查询可以用于分组、求和、计数、平均值、最大值、最小值等数据分析操作。
	
DSL语法在ES中提供了一种灵活而强大的方式来构建查询和分析语句。通过使用DSL,可以轻松定义各种查询条件、过滤器、排序规则和聚合操作,以满足特定的搜索和分析需求。

你说一下 match和term的区别?

Elasticsearch(ES)中,match和term是两种常用的查询类型,用于不同的查询目的和场景。它们之间的区别如下:

查询方式:
match查询:match查询是一种全文匹配查询,它会根据指定的分词器对字段进行分词,并将搜索词与字段中的分词进行匹配。它不仅匹配完全相等的词,还可以进行词根化、模糊匹配等操作。
term查询:term查询是一种精确匹配查询,它会精确地匹配字段中与给定术语完全相等的文档。它不对搜索词进行分词或变换,只进行完全匹配。
	
分析和处理方式:
match查询:match查询会使用指定的分词器对搜索词进行分析和处理,然后将分析后的结果与字段中的分词进行匹配。它支持自然语言处理、词根化、模糊匹配等操作,适合处理全文搜索的场景。
term查询:term查询不对搜索词进行分析和处理,直接将搜索词与字段中的术语进行精确匹配。它适合处理需要精确匹配的场景,例如匹配关键字、精确值等。
	
查询目的:
match查询:match查询主要用于全文搜索,它可以对文本进行分析和处理,支持匹配多个分词,具有更大的灵活性和宽松的匹配策略。
term查询:term查询主要用于精确匹配,它对搜索词不进行分析和处理,只进行完全的精确匹配,适用于需要精确匹配的场景,如精确值匹配、关键字匹配等。
	
需要根据具体的搜索需求和场景来选择使用match查询还是term查询。如果需要全文搜索、模糊匹配或词根化等功能,match查询更合适。如果需要精确匹配、精确值查询或关键字匹配,term查询更适合。

你使用过ES的哪些聚合查询?

Elasticsearch(ES)提供了多种聚合查询类型。以下是一些常见的ES聚合查询以及相应的示例:

Terms Aggregation(术语聚合):
"aggs": {
  "genres": {
    "terms": {
      "field": "genre.keyword"
    }
  }
}
上述示例将根据"genre.keyword"字段对文档进行分组,并计算每个分组的文档数量。

Range Aggregation(范围聚合):
"aggs": {
  "price_ranges": {
    "range": {
      "field": "price",
      "ranges": [
        { "to": 100 },
        { "from": 100, "to": 200 },
        { "from": 200 }
      ]
    }
  }
}
上述示例将根据"price"字段的值范围对文档进行分组,并统计每个范围内的文档数量。

Date Histogram Aggregation(日期直方图聚合):
"aggs": {
  "sales_over_time": {
    "date_histogram": {
      "field": "date",
      "calendar_interval": "month"
    }
  }
}
上述示例将根据"date"字段按月份对文档进行分组,并统计每个月份的文档数量。

Histogram Aggregation(直方图聚合):
"aggs": {
  "age_distribution": {
    "histogram": {
      "field": "age",
      "interval": 10
    }
  }
}
上述示例将根据"age"字段的值按10个单位间隔进行分组,并统计每个分组内的文档数量。

Avg Aggregation(平均值聚合):
"aggs": {
  "avg_price": {
    "avg": {
      "field": "price"
    }
  }
}
上述示例将计算"price"字段的平均值。

这只是一小部分ES聚合查询的示例。ES还提供了更多聚合查询类型和选项,如Sum Aggregation(求和聚合)、Min Aggregation(最小值聚合)、Max Aggregation(最大值聚合)、Cardinality Aggregation(基数聚合)等。根据具体的需求,可以选择合适的聚合查询来进行数据分析和统计。

ES高亮怎么做的?

Elasticsearch(ES)中,可以通过使用高亮(Highlighting)功能来突出显示搜索结果中匹配的关键字或短语。以下是一般步骤:

在查询请求中添加highlight参数,指定需要高亮的字段和其他可选参数:
"query": {
  "match": {
    "content": "keyword"
  }
},
"highlight": {
  "fields": {
    "content": {}
  }
}
上述示例中,查询字段"content"中包含关键字"keyword"的文档,并对"content"字段进行高亮处理。

在查询结果中,ES会返回每个匹配的字段及其高亮内容。例如:
"hits": {
  "total": {
    "value": 1
  },
  "hits": [
    {
      "_source": {
        "content": "This is some sample text."
      },
      "highlight": {
        "content": [
          "This is <em>some</em> sample text."
        ]
      }
    }
  ]
}
上述示例中,查询结果中的"content"字段被高亮标记,使用<em></em>标签包围匹配的关键字"some"。

可以在高亮参数中设置其他选项来定制高亮显示的方式,如标签样式、片段数量等。例如:
"highlight": {
  "fields": {
    "content": {
      "pre_tags": ["<strong>"],
      "post_tags": ["</strong>"],
      "fragment_size": 100,
      "number_of_fragments": 3
    }
  }
}
上述示例中,使用<strong></strong>标签替代默认的<em></em>标签,并设置每个字段返回的片段长度为100个字符,最多返回3个片段。

通过配置高亮参数,可以根据需求定制化高亮显示的样式和行为。这样可以使搜索结果中的匹配部分更加明显,帮助用户更好地理解搜索结果和关键字匹配的位置。

ES和数据库的数据一致性怎么做的

Elasticsearch(ES)和传统数据库之间确保数据一致性是一个复杂的问题,因为ES是一种面向搜索和分布式实时分析的分布式文档数据库,而传统数据库通常遵循ACID(原子性、一致性、隔离性和持久性)事务模型。以下是一些常见的方法和策略来处理ES和数据库之间的数据一致性:

双写(Dual Writes):在应用程序中同时写入ES和数据库。每当有数据变更操作时,确保将更新同时应用到ES和数据库中。这种方法确保了数据的一致性,但也增加了写入的复杂性和延迟。

事件驱动的架构(Event-Driven Architecture):将数据库的变更操作作为事件发布,然后通过事件订阅机制将这些事件传递给ES进行相应的更新。这种方式可以确保ES和数据库之间的数据保持同步,但需要建立和管理事件发布/订阅的基础设施。

变更数据捕获(Change Data Capture,CDC):使用CDC技术来捕获数据库的变更操作,然后将这些变更操作应用到ES中。CDC可以通过数据库日志、触发器或其他机制来实现。这种方式可以保持ES和数据库之间的数据一致性,但需要额外的配置和处理。

批量同步(Batch Synchronization):定期或按需将数据库中的数据批量同步到ES。例如,可以使用定时任务或数据同步工具将数据库中的数据导入到ES中。这种方法可以实现数据的一致性,但可能存在数据延迟。

需要注意的是,ES是一种面向全文搜索和实时分析的数据库,并且在数据一致性方面与传统数据库可能存在差异。ES的数据复制和分布式架构可能导致数据同步的延迟和一致性挑战。因此,在设计和开发应用程序时,需要根据具体的业务需求和数据一致性要求来选择合适的策略,并在应用层面实现必要的数据一致性保证。

你们项目怎么使用ES

回答1:
我们在项目中使用Elasticsearch(ES)来实现全文搜索和实时数据分析功能。首先,我们安装和配置了ES集群,并创建了适合我们应用程序的索引结构。我们使用ES提供的API(如RESTful API或Java API)将数据以JSON格式插入到ES索引中。在应用程序中,我们使用ES的查询DSL构建搜索和过滤条件,然后通过API向ES发起查询请求。ES返回符合条件的文档列表,我们可以根据需要进行排序、过滤和分页处理。此外,我们还利用ES的聚合查询功能对数据进行统计和分析,并使用结果进行可视化展示和报告生成。我们通过定时任务或实时事件订阅机制,确保ES和我们的数据库保持数据一致性,以提供准确和实时的搜索和分析结果。

回答2:
在我们的项目中,我们使用Elasticsearch(ES)作为我们的主要数据存储和搜索引擎。我们通过将数据以JSON格式插入ES索引中来建立文档集合。我们利用ES的全文搜索功能,实现了高效的关键字搜索和模糊匹配。我们使用ES的查询DSL构建复杂的查询条件,包括匹配、过滤和范围查询等。我们还利用ES的聚合查询功能,对数据进行分组、计数、求和等统计操作,并生成各种报告和可视化图表。为了保持数据一致性,我们在应用程序中使用双写策略,即在数据更新时同时将变更写入ES和我们的数据库。通过这种方式,我们能够在应用程序中提供快速和准确的搜索功能,并从数据中获取有价值的见解和分析结果。

ES有线程安全问题吗?你们是如何解决线程安全问题的?

Elasticsearch(ES)本身是线程安全的,它使用了并发控制机制来保证多线程环境下的数据一致性和安全性。ES的线程安全性主要体现在以下几个方面:

写入操作:ES的写入操作是线程安全的。ES采用了分布式索引和复制机制,可以将数据分片存储在多个节点上,并确保数据的一致性和完整性。当多个线程同时进行写入操作时,ES会自动处理并保证数据的正确复制和同步。

并发查询:ES支持并发查询,多个线程可以同时发送查询请求。ES使用了倒排索引和分片查询等技术来加速查询,并通过合理的资源调度和并发控制机制来保证查询的效率和正确性。

分布式锁:ES提供了分布式锁机制来处理并发更新和操作。当多个线程需要对同一个索引或文档进行修改时,ES会使用分布式锁来确保只有一个线程能够获取到锁并执行操作,从而避免冲突和数据不一致的问题。

作为开发者,在使用ES时可以采取一些措施来进一步保证线程安全:

使用连接池:使用连接池管理与ES的连接,确保每个线程都可以获得独立的连接,避免线程间的资源竞争和冲突。

合理调整并发级别:根据实际需求和硬件资源,合理设置并发级别,避免过多的并发请求导致性能下降或资源竞争。

考虑数据同步延迟:由于ES采用了分布式架构,数据同步存在一定的延迟。在设计和实现业务逻辑时,需要考虑到数据同步的延迟性,并采取适当的策略来处理可能的数据不一致情况。

总之,ES是一个具有良好线程安全性的分布式搜索和分析引擎。合理配置和使用ES,并采取适当的线程安全策略,可以确保多线程环境下的数据一致性和安全性。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值