国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spark底層為什么選擇使用scala語(yǔ)言開(kāi)發(fā)

這篇具有很好參考價(jià)值的文章主要介紹了spark底層為什么選擇使用scala語(yǔ)言開(kāi)發(fā)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Spark 底層使用 Scala 開(kāi)發(fā)有以下幾個(gè)原因:

基于Scala的語(yǔ)言特性

  1. 集成性:Scala 是一種運(yùn)行在 Java 虛擬機(jī)(JVM)上的靜態(tài)類(lèi)型編程語(yǔ)言,可以與 Java 代碼無(wú)縫集成。由于 Spark 涉及到與大量 Java 生態(tài)系統(tǒng)的交互,例如 Hadoop、Hive 等,使用 Scala 可以方便地與這些組件進(jìn)行集成和交互。

  2. 函數(shù)式編程支持:Scala 是一種面向函數(shù)式編程的語(yǔ)言,提供了豐富的函數(shù)式編程特性,如高階函數(shù)、閉包等。這些特性使得編寫(xiě)復(fù)雜的數(shù)據(jù)處理邏輯變得更加簡(jiǎn)潔和靈活,而大規(guī)模數(shù)據(jù)處理正是 Spark 的核心任務(wù)之一。因此,Scala 為 Spark 提供了一種非常適合處理數(shù)據(jù)流的語(yǔ)言基礎(chǔ)。

  3. 強(qiáng)類(lèi)型系統(tǒng):Scala 是一種靜態(tài)類(lèi)型語(yǔ)言,擁有強(qiáng)大的類(lèi)型系統(tǒng)。通過(guò)靜態(tài)類(lèi)型檢查,可以在編譯期間捕獲一些潛在的錯(cuò)誤,提高代碼的可靠性和穩(wěn)定性。這對(duì)于 Spark 這樣大規(guī)模數(shù)據(jù)處理的框架至關(guān)重要,因?yàn)樗梢詭椭_(kāi)發(fā)人員盡早發(fā)現(xiàn)潛在的問(wèn)題。

  4. 可擴(kuò)展性:Scala 具有良好的可擴(kuò)展性,可以輕松地?cái)U(kuò)展現(xiàn)有的代碼庫(kù),以適應(yīng) Spark 框架不斷增長(zhǎng)的需求。同時(shí),Scala 還提供了豐富的函數(shù)式編程特性,如類(lèi)型推斷、模式匹配等,使得代碼的組織和重用更加方便。

  5. 并發(fā)性:Scala 提供了強(qiáng)大的并發(fā)編程特性,例如 Future、Actor 等。這些特性使得在 Spark 中處理并發(fā)任務(wù)更加高效和簡(jiǎn)潔,從而提高了系統(tǒng)的性能和可伸縮性。

Scala 提供了強(qiáng)大的并發(fā)編程特性

Scala 提供了強(qiáng)大的并發(fā)編程特性,這主要基于以下幾個(gè)方面:

  1. FuturePromise:Scala 標(biāo)準(zhǔn)庫(kù)提供了 scala.concurrent.Futurescala.concurrent.Promise 類(lèi),用于處理異步計(jì)算和并發(fā)操作。Future 表示一個(gè)可能還未完成的計(jì)算結(jié)果,而 Promise 則是對(duì) Future 的簡(jiǎn)單抽象,可以用來(lái)設(shè)置 Future 的結(jié)果。通過(guò) FuturePromise,可以方便地進(jìn)行并行計(jì)算、異步操作和任務(wù)組合,提高代碼的效率和性能。

  2. Actor 模型:Scala 通過(guò) Akka 庫(kù)提供了 Actor 模型的支持。Actor 是并發(fā)和分布式計(jì)算中的基本單位,它是一種輕量級(jí)的并發(fā)原語(yǔ),用于實(shí)現(xiàn)消息傳遞和并發(fā)任務(wù)的處理。Scala 中的 Actor 可以通過(guò)消息傳遞進(jìn)行通信,每個(gè) Actor 都有自己的狀態(tài)和行為,并且可以相互之間進(jìn)行消息的發(fā)送和接收。使用 Actor 模型,可以通過(guò)消息傳遞實(shí)現(xiàn)并發(fā)任務(wù)的解耦和靈活性,避免共享狀態(tài)帶來(lái)的并發(fā)問(wèn)題。

  3. 并發(fā)集合(Concurrent Collections):Scala 提供了一系列并發(fā)集合類(lèi),如 ConcurrentHashMap、ConcurrentLinkedQueue 等,它們是線程安全的,并且提供了并發(fā)訪問(wèn)和更新的方法。在多線程環(huán)境下,使用這些并發(fā)集合可以簡(jiǎn)化對(duì)共享數(shù)據(jù)的訪問(wèn)和管理,避免線程安全的問(wèn)題,提高并發(fā)性能。

  4. 樣本(Pattern)和不可變性:Scala 支持函數(shù)式編程風(fēng)格,并鼓勵(lì)使用不可變數(shù)據(jù)結(jié)構(gòu)。不可變數(shù)據(jù)結(jié)構(gòu)天然地支持并發(fā),因?yàn)槎鄠€(gè)線程可以并發(fā)地讀取不可變數(shù)據(jù),而無(wú)需擔(dān)心數(shù)據(jù)的修改。此外,Scala 的樣本匹配機(jī)制(Pattern Matching)可以幫助開(kāi)發(fā)者處理并發(fā)場(chǎng)景中的不同情況和消息,使得代碼更加清晰和易于理解。

scala的Future與java多線程中的Future接口,他們之間有什么關(guān)系?

Scala 的 Future 類(lèi)是基于 Java 的 Future 接口進(jìn)行擴(kuò)展和增強(qiáng)的,它們之間存在一定的關(guān)系。

在 Scala 中,scala.concurrent.Future 是一個(gè)非阻塞的、并發(fā)編程的核心類(lèi),它提供了以異步方式處理任務(wù)的功能。Future 類(lèi)定義了一組操作符和組合方法,使得異步計(jì)算的編寫(xiě)和組合更加方便和靈活。

與此同時(shí),Java 的 java.util.concurrent.Future 接口也用于表示可能還未完成的計(jì)算結(jié)果。它可以用于提交任務(wù)并獲取最終結(jié)果,但相對(duì)于 Scala 的 Future,Java 的 Future 功能較為簡(jiǎn)單。Java 8 引入的 CompletableFuture 類(lèi)提供了類(lèi)似于 Scala Future 的操作符和組合功能,但仍然不如 Scala Future 強(qiáng)大。

Scala 的 Future 類(lèi)庫(kù)使用了 Java 的 ExecutorServiceScheduledExecutorService 類(lèi)來(lái)執(zhí)行異步任務(wù),底層仍然是基于 Java 的線程池實(shí)現(xiàn)。

需要注意的是,Scala 的 Future 類(lèi)和 Java 的 Future 接口之間并沒(méi)有直接的繼承關(guān)系,雖然它們都用于處理可能還未完成的計(jì)算結(jié)果。Scala 的 Future 更像是對(duì) Java 的 Future 進(jìn)行了擴(kuò)展和增強(qiáng),提供了更豐富的功能和操作符。

因此,盡管 Scala 的 Future 類(lèi)與 Java 的 Future 接口有一定的關(guān)系,但它們是獨(dú)立的并發(fā)編程模型,各自具有不同的特性和功能。


雖然它們的名稱(chēng)相似,但在功能和用法上有一些區(qū)別。下面是它們之間的主要區(qū)別:

  1. Scala 的 Future 是一個(gè)只讀的、不可變的抽象類(lèi),它表示一個(gè)可能還未完成的計(jì)算結(jié)果。你可以將任務(wù)提交給 Future,并在任務(wù)完成后獲取到結(jié)果。它通常用于處理異步計(jì)算和并發(fā)操作。

    Java 的 Future 接口也用于表示可能未來(lái)完成的計(jì)算結(jié)果,但它是一個(gè)可寫(xiě)的接口。通過(guò)調(diào)用 cancel() 方法可以取消任務(wù)的執(zhí)行,而且還提供了一些其他方法如 isDone()get() 來(lái)查詢(xún)?nèi)蝿?wù)的狀態(tài)和獲取最終結(jié)果。

  2. Scala 的 Future 提供了更加豐富的操作符和組合功能,例如 map、flatMap、filter 等,可以對(duì)多個(gè) Future 進(jìn)行轉(zhuǎn)換、組合和過(guò)濾,從而構(gòu)建復(fù)雜的異步計(jì)算流程。

    Java 的 Future 接口相對(duì)較為簡(jiǎn)單,沒(méi)有提供類(lèi)似的操作符和組合功能。雖然 Java 8 中引入了 CompletableFuture 類(lèi)來(lái)提供類(lèi)似的功能,但與 Scala 的 Future 相比,仍然較為有限。

總的來(lái)說(shuō),Scala 的 Future 更加強(qiáng)大和靈活,提供了更多的操作符和組合功能,使得異步編程更加方便和高效。在 Scala 中,你可以使用 Future 來(lái)處理并發(fā)任務(wù)、異步操作和任務(wù)的組合。

如何理解Scala中的Promise類(lèi)?它的底層是怎么實(shí)現(xiàn)的?

在 Scala 中,Promise 是一個(gè)用于表示異步計(jì)算結(jié)果的類(lèi)。它是對(duì) Future 的一種補(bǔ)充,可以將值設(shè)置到 Promise 中,并且可以通過(guò) Promise 來(lái)獲取最終的結(jié)果。

Promise 的底層源碼基于 Futuresynchronization 實(shí)現(xiàn)。底層的原理如下:

  1. Promise 類(lèi)包含了一個(gè) Future 對(duì)象,用于保存最終的結(jié)果。
  2. 當(dāng)你創(chuàng)建一個(gè) Promise 實(shí)例時(shí),它會(huì)同時(shí)創(chuàng)建一個(gè)關(guān)聯(lián)的 Future 對(duì)象。
  3. 你可以使用 Promisesuccess、failurecomplete 方法來(lái)設(shè)置 Future 的結(jié)果。
    • success(value: T): Promise.this.type:將 Future 的結(jié)果標(biāo)記為成功,并設(shè)置結(jié)果值為 value。
    • failure(cause: Throwable): Promise.this.type:將 Future 的結(jié)果標(biāo)記為失敗,并設(shè)置失敗原因?yàn)?cause。
    • complete(result: Try[T]): Promise.this.type:根據(jù) Try 對(duì)象的結(jié)果設(shè)置 Future 的結(jié)果。
  4. 在調(diào)用 success、failurecomplete 之后,關(guān)聯(lián)的 Future 將會(huì)收到相應(yīng)的通知并得到最終結(jié)果。
  5. 如果你需要獲取 Promise 關(guān)聯(lián)的 Future,可以使用 future 屬性進(jìn)行訪問(wèn)。

底層實(shí)現(xiàn)使用了同步機(jī)制來(lái)確保在多線程環(huán)境下的正確性。當(dāng)調(diào)用 success、failurecomplete 方法時(shí),Promise 會(huì)檢查當(dāng)前的狀態(tài),如果狀態(tài)尚未改變,則設(shè)置 Future 的結(jié)果,并通知正在等待的線程。

在使用 PromiseFuture 時(shí),你可以將異步計(jì)算任務(wù)提交給 Promise,并在其他地方通過(guò)關(guān)聯(lián)的 Future 來(lái)獲取最終的結(jié)果。這種方式可以更加靈活地進(jìn)行異步計(jì)算和處理,并提供了更多的控制能力。

總的來(lái)說(shuō),Promise 是 Scala 中用于設(shè)置異步計(jì)算結(jié)果的類(lèi),它的底層源碼利用了 Future 和同步機(jī)制來(lái)實(shí)現(xiàn)異步計(jì)算的處理。

如何理解Spark中的RDD抽象數(shù)據(jù)模型

RDD 是 Spark 中最基本的數(shù)據(jù)抽象和計(jì)算模型,它的實(shí)現(xiàn)涉及以下幾個(gè)核心概念和原理:

  1. 數(shù)據(jù)分片(Partitioning):RDD 將數(shù)據(jù)集合切分為多個(gè)邏輯分片,每個(gè)分片代表了數(shù)據(jù)的一部分。分片的大小通常會(huì)根據(jù)數(shù)據(jù)的大小和集群的規(guī)模進(jìn)行自動(dòng)調(diào)整。

  2. 彈性分布式數(shù)據(jù)集(Resilient Distributed Dataset):RDD 將數(shù)據(jù)分布在集群中的多個(gè)節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)上可以保存一個(gè)或多個(gè)數(shù)據(jù)分片。RDD 具有容錯(cuò)性,即在節(jié)點(diǎn)故障時(shí)可以恢復(fù)丟失的數(shù)據(jù)分片。

  3. 轉(zhuǎn)換和動(dòng)作(Transformations and Actions):RDD 提供了一組轉(zhuǎn)換和動(dòng)作操作,用于對(duì)數(shù)據(jù)集合進(jìn)行處理和操作。轉(zhuǎn)換操作(Transformations)是惰性計(jì)算的,只記錄了要對(duì) RDD 進(jìn)行的轉(zhuǎn)換操作,并不真正執(zhí)行計(jì)算。動(dòng)作操作(Actions)則觸發(fā)實(shí)際的計(jì)算,并返回結(jié)果或副作用。

  4. 依賴(lài)關(guān)系(Dependency):RDD 之間的轉(zhuǎn)換操作會(huì)構(gòu)成依賴(lài)關(guān)系。每個(gè) RDD 都記錄了自己的父 RDD 的依賴(lài)關(guān)系,這樣在執(zhí)行計(jì)算時(shí)可以通過(guò)鏈?zhǔn)秸{(diào)用進(jìn)行血緣追蹤,以便在需要時(shí)重新計(jì)算丟失的數(shù)據(jù)分片。

  5. 寬依賴(lài)和窄依賴(lài)(Wide and Narrow Dependencies):依賴(lài)關(guān)系可以分為寬依賴(lài)和窄依賴(lài)。窄依賴(lài)表示每個(gè)父分區(qū)最多只被一個(gè)子分區(qū)使用,這種依賴(lài)關(guān)系允許并行計(jì)算。而寬依賴(lài)表示同一個(gè)父分區(qū)可能被多個(gè)子分區(qū)使用,這種依賴(lài)關(guān)系會(huì)導(dǎo)致數(shù)據(jù)的 shuffle 操作,降低了并行度和性能。

  6. 數(shù)據(jù)分片的計(jì)算和調(diào)度:Spark 使用任務(wù)調(diào)度器將 RDD 的轉(zhuǎn)換操作劃分為多個(gè)任務(wù),并將這些任務(wù)分發(fā)到集群中的不同節(jié)點(diǎn)上進(jìn)行計(jì)算。計(jì)算節(jié)點(diǎn)上的任務(wù)會(huì)根據(jù) RDD 的依賴(lài)關(guān)系和分片信息進(jìn)行數(shù)據(jù)的加載、轉(zhuǎn)換和保存。

  7. 內(nèi)存緩存(In-Memory Caching):RDD 可以選擇將數(shù)據(jù)分片緩存在內(nèi)存中,以便在后續(xù)迭代計(jì)算中更快地訪問(wèn)。緩存 RDD 可以避免重復(fù)計(jì)算和磁盤(pán) I/O,提高計(jì)算性能。

這些原理使得 RDD 具備了彈性、容錯(cuò)、并行計(jì)算和優(yōu)化的特性,從而能夠支持 Spark 的分布式計(jì)算和數(shù)據(jù)處理。通過(guò)對(duì) RDD 的轉(zhuǎn)換和動(dòng)作操作的靈活組合,可以實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)處理任務(wù),并通過(guò)合理的調(diào)度和緩存策略提高計(jì)算性能。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-693280.html

到了這里,關(guān)于spark底層為什么選擇使用scala語(yǔ)言開(kāi)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 為什么 Golang Fasthttp 選擇使用 slice 而非 map 存儲(chǔ)請(qǐng)求數(shù)據(jù)

    為什么 Golang Fasthttp 選擇使用 slice 而非 map 存儲(chǔ)請(qǐng)求數(shù)據(jù)

    Fasthttp 是一個(gè)高性能的 Golang HTTP 框架,它在設(shè)計(jì)上做了許多優(yōu)化以提高性能。其中一個(gè)顯著的設(shè)計(jì)選擇是使用 slice 而非 map 來(lái)存儲(chǔ)數(shù)據(jù),尤其是在處理 HTTP headers 時(shí)。 為什么呢? 本文將從簡(jiǎn)單到復(fù)雜,逐步剖析為什么 Fasthttp 選擇使用 slice 而非 map,并通過(guò)代碼示例解釋這一

    2024年01月22日
    瀏覽(21)
  • 為什么選擇C/C++內(nèi)存檢測(cè)工具AddressSanitizer?如何使用AddressSanitizer?

    目錄 1、C++程序中的內(nèi)存問(wèn)題 2、AddressSanitizer是什么? 3、AddressSanitizer內(nèi)存檢測(cè)原理簡(jiǎn)述

    2024年02月09日
    瀏覽(16)
  • 為什么要去了解javascript的底層?

    JavaScript的基本數(shù)據(jù)類(lèi)型包括:數(shù)字、字符串、布爾值、null、undefined。其中,數(shù)字類(lèi)型可以是整數(shù)或浮點(diǎn)數(shù),字符串類(lèi)型用單引號(hào)或雙引號(hào)表示,布爾值只有true和false兩個(gè)取值,null表示一個(gè)空值,undefined表示一個(gè)未定義的值。 在JavaScript底層實(shí)現(xiàn)中,每種數(shù)據(jù)類(lèi)型都有相應(yīng)的

    2024年02月01日
    瀏覽(21)
  • 為什么越來(lái)越多的開(kāi)發(fā)者放棄使用Postman,而選擇Apifox

    為什么越來(lái)越多的開(kāi)發(fā)者放棄使用Postman,而選擇Apifox

    1、Postman + Swagger + Mock + JMeter 作為一個(gè)后端開(kāi)發(fā),我做的大部分項(xiàng)目一般都是基于 Swagger 來(lái)管理 API 文檔,基于 Postman 來(lái)做接口調(diào)試,基于 JMeter 來(lái)做接口性能測(cè)試,基于 RAP 等工具 Mock API 數(shù)據(jù)。 2、存在的問(wèn)題 (1)多系統(tǒng)數(shù)據(jù)不互通 API設(shè)計(jì)者、前端開(kāi)發(fā)、后端開(kāi)發(fā)、測(cè)試人

    2024年01月20日
    瀏覽(33)
  • Go 語(yǔ)言為什么很少使用數(shù)組?

    大家好,我是 frank,「Golang 語(yǔ)言開(kāi)發(fā)棧」公眾號(hào)作者。 01 介紹 在 Go 語(yǔ)言中,數(shù)組是一塊連續(xù)的內(nèi)存,數(shù)組不可以擴(kuò)容,數(shù)組在作為參數(shù)傳遞時(shí),屬于值傳遞。 數(shù)組的長(zhǎng)度和類(lèi)型共同決定數(shù)組的類(lèi)型,不同類(lèi)型的數(shù)組之間不可以比較,否則在編譯時(shí)會(huì)報(bào)錯(cuò)。 因?yàn)閿?shù)組的一些

    2024年02月04日
    瀏覽(21)
  • Go 語(yǔ)言為什么建議多使用切片,少使用數(shù)組?

    大家好,我是 frank,「Golang 語(yǔ)言開(kāi)發(fā)?!构娞?hào)作者。 01 介紹 在 Go 語(yǔ)言中,數(shù)組固定長(zhǎng)度,切片可變長(zhǎng)度;數(shù)組和切片都是值傳遞,因?yàn)榍衅瑐鬟f的是指針,所以切片也被稱(chēng)為“引用傳遞”。 讀者朋友們?cè)谑褂?Go 語(yǔ)言開(kāi)發(fā)項(xiàng)目時(shí),或者在閱讀 Go 開(kāi)源項(xiàng)目源碼時(shí),發(fā)現(xiàn)很少

    2024年02月03日
    瀏覽(33)
  • NFT 為什么會(huì)有差異,探索底層的鑄造協(xié)議

    NFT 為什么會(huì)有差異,探索底層的鑄造協(xié)議

    NFT 的流行,讓許多人都對(duì)它已經(jīng)不怎么陌生了。但你真正了解過(guò)它么?從表面來(lái)看,每個(gè) NFT 之間的性質(zhì)、特點(diǎn)以及屬性和功能等都沒(méi)有多大的差別,當(dāng)我們深入了解時(shí)才會(huì)發(fā)現(xiàn),在不同應(yīng)用領(lǐng)域的 NFT 之間,也有一些細(xì)微的不同。是什么導(dǎo)致了這些差異的存在呢?這個(gè)問(wèn)題

    2024年02月15日
    瀏覽(16)
  • spark為什么比mapreduce快?

    spark為什么比mapreduce快? 1:兩者都是基于內(nèi)存計(jì)算的,任何計(jì)算框架都肯定是基于內(nèi)存的,所以網(wǎng)上說(shuō)的spark是基于內(nèi)存計(jì)算所以快,顯然是錯(cuò)誤的 2;DAG計(jì)算模型減少的是磁盤(pán)I/O次數(shù)(相比于mapreduce計(jì)算模型而言),而不是shuffle次數(shù),因?yàn)閟huffle是根據(jù)數(shù)據(jù)重組的次數(shù)而定,

    2024年02月21日
    瀏覽(15)
  • MySQL為什么采用B+樹(shù)作為索引底層數(shù)據(jù)結(jié)構(gòu)?

    MySQL為什么采用B+樹(shù)作為索引底層數(shù)據(jù)結(jié)構(gòu)?

    ????????索引就像一本書(shū)的目錄,通過(guò)索引可以快速找到我們想要找的內(nèi)容。那么什么樣的數(shù)據(jù)結(jié)構(gòu)可以用來(lái)實(shí)現(xiàn)索引呢?我們可能會(huì)想到:二叉查找樹(shù),平衡搜索樹(shù),或者是B樹(shù)等等一系列的數(shù)據(jù)結(jié)構(gòu),那么為什么MySQL最終選擇了B+樹(shù)作為索引的數(shù)據(jù)結(jié)構(gòu)呢? ? ? ? ? 要想

    2024年02月16日
    瀏覽(25)
  • spark中為什么要設(shè)置寬窄依賴(lài)

    寬依賴(lài)指的是兩個(gè)或多個(gè)任務(wù)或數(shù)據(jù)之間具有較強(qiáng)的依賴(lài)關(guān)系。也就是說(shuō),在執(zhí)行某個(gè)任務(wù)之前,需要先完成其他幾個(gè)任務(wù)。寬依賴(lài)通常會(huì)導(dǎo)致任務(wù)串行執(zhí)行,因?yàn)橐粋€(gè)任務(wù)的開(kāi)始必須等到其它任務(wù)的結(jié)束。這種關(guān)系會(huì)增加系統(tǒng)的延遲和執(zhí)行時(shí)間。例如,如果任務(wù)A依賴(lài)于任務(wù)

    2024年02月12日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包