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

性能超越 Clickhouse | 物聯(lián)網(wǎng)場(chǎng)景中的毫秒級(jí)查詢案例

這篇具有很好參考價(jià)值的文章主要介紹了性能超越 Clickhouse | 物聯(lián)網(wǎng)場(chǎng)景中的毫秒級(jí)查詢案例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1 物聯(lián)網(wǎng)應(yīng)用場(chǎng)景簡(jiǎn)介

物聯(lián)網(wǎng)(Internet of Things,簡(jiǎn)稱 IoT)是指通過(guò)各種信息傳感、通信和 IT 技術(shù)來(lái)實(shí)時(shí)連接、采集、監(jiān)管海量的傳感設(shè)備,從而實(shí)現(xiàn)對(duì)現(xiàn)實(shí)世界的精確感知和快速響應(yīng),繼而實(shí)現(xiàn)自動(dòng)化、智能化管理。在查詢 IoT 設(shè)備狀態(tài)的場(chǎng)景下,吞吐量和時(shí)延是兩個(gè)重要的性能指標(biāo)。

在工業(yè)物聯(lián)網(wǎng)中,常見(jiàn)有以下幾種設(shè)備時(shí)序數(shù)據(jù)的查詢需求:

  • 案例1:查詢某個(gè)設(shè)備最近的記錄
  • 案例2:查詢某個(gè)租戶所有設(shè)備的最近一條記錄
  • 案例3:查詢某個(gè)設(shè)備最近5分鐘的統(tǒng)計(jì)信息
  • 案例4:查詢某個(gè)設(shè)備最近一天的秒級(jí)數(shù)據(jù)

本教程通過(guò)一個(gè)工業(yè)物聯(lián)網(wǎng)的案例,來(lái)演示 DolphinDB 的序列查詢性能,并對(duì)比測(cè)試了 DolphinDB TSDB 引擎、OLAP 引擎,以及 ClickHouse MergeTree 引擎在上述查詢案例上的時(shí)延指標(biāo)??傮w來(lái)說(shuō),DolphinDB TSDB 引擎的性能(時(shí)延)對(duì)比 DolphinDB OLAP 引擎和 ClickHouse MergeTree 引擎有顯著優(yōu)勢(shì)。

2 案例數(shù)據(jù)準(zhǔn)備

2.1 數(shù)據(jù)集說(shuō)明

本教程參考了某工業(yè)物聯(lián)網(wǎng) SaaS 平臺(tái)服務(wù)商的數(shù)據(jù)集,模擬并使用一份高度仿真的數(shù)據(jù)。該SaaS服務(wù)商的主要業(yè)務(wù)是監(jiān)控各個(gè)地區(qū)的噪聲情況。表結(jié)構(gòu)如下:

序號(hào) 字段名稱 字段類型 注釋
1 tenantId INT 租戶ID
2 deviceId INT 設(shè)備ID
3 soundPressureLevel DOUBLE 聲音分貝
4 soundPowerLevel DOUBLE 聲音功率值
5 ts TIMESTAMP 數(shù)據(jù)采集時(shí)間戳
6 date DATE 日期

一行數(shù)據(jù)包含租戶 ID、設(shè)備 ID、聲壓、噪聲功率、采集時(shí)間戳和日期共計(jì) 6 列數(shù)據(jù)。每行記錄占用 36 字節(jié)。該案例數(shù)據(jù)包含100 個(gè)租戶,每個(gè)租戶管理 100 個(gè)噪聲監(jiān)控設(shè)備,記錄了從 2022-01-01 至 2022-01-12,12億的噪聲數(shù)據(jù),共計(jì) 40G。

2.2 庫(kù)表設(shè)計(jì)及數(shù)據(jù)模擬

使用 DolphinDB TSDB 引擎,創(chuàng)建一個(gè)名為 NoiseDB 的數(shù)據(jù)庫(kù),存儲(chǔ)噪聲數(shù)據(jù)。TSDB 引擎是 DolphinDB 自 2.00 版本起,專門(mén)為物聯(lián)網(wǎng)場(chǎng)景設(shè)計(jì)研發(fā)的數(shù)據(jù)存儲(chǔ)引擎,具備優(yōu)秀的寫(xiě)入和序列查詢性能。

在噪聲監(jiān)控的 SaaS 服務(wù)中,較為頻繁的查詢場(chǎng)景是以租戶為維度,查詢某一天某個(gè)設(shè)備的狀態(tài)信息。因此設(shè)計(jì) noise 表按日期、租戶 ID 進(jìn)行分區(qū),可以有效利用分區(qū)剪枝。同時(shí)使用區(qū)分度較高的設(shè)備 ID 和數(shù)據(jù)采集時(shí)間戳作為排序鍵(查詢索引),使查詢時(shí)能夠快速定位對(duì)應(yīng)設(shè)備的數(shù)據(jù),提升查詢性能。具體實(shí)現(xiàn)腳本如下。

db1 = database(,VALUE,1000..2000) 
db2  = database(, VALUE, 2022.01.01..2022.12.30) 

// TSDB for iot 
dbNoise = database("dfs://NoiseDB",COMPO,[db1,db2], engine="TSDB") 

create table "dfs://NoiseDB"."noise"(
    tenantId INT,
    deviceId INT,
    soundPressureLevel INT,
    soundPowerLevel DOUBLE,
    ts TIMESTAMP,
    date DATE
)
partitioned by tenantId, date
sortColumns=[`deviceId,`ts]

庫(kù)表創(chuàng)建完成后,模擬 2022-01-01 至 2022-01-12 的數(shù)據(jù),具體代碼詳見(jiàn)附錄?DolphinDB 腳本。

可以通過(guò) SQL 查詢驗(yàn)證下數(shù)據(jù)集大?。?/p>

select count(*) from  loadTable(database("dfs://NoiseDB"),"noise") where date between 2022.01.01:2022.01.102> 1260010000

導(dǎo)入完成后,每個(gè)分區(qū)下生成3個(gè)level 0 file,未滿足自動(dòng)合并條件(大于等于10個(gè) levelFile),需要進(jìn)行手動(dòng)合并。

chunkIds = exec chunkId from getChunksMeta() where type=1
for (x in chunkIds) {
  triggerTSDBCompaction(x)
}

完成后將案例數(shù)據(jù)導(dǎo)出數(shù)據(jù)至 csv 文件,以便后續(xù)導(dǎo)入 OLAP 引擎、ClickHouse。在 ClickHouse 中使用OPTIMIZE TABLE noise?合并下 mergeTree。具體過(guò)程參照附錄 ClickHouse 腳本。

3 SQL 查詢

在 DolphinDB 中,可以使用 SQL 快速實(shí)現(xiàn)4個(gè)設(shè)備狀態(tài)查詢需求,并且代碼十分簡(jiǎn)潔。

  • 案例1:查詢某個(gè)設(shè)備最近的100條記錄:
noise = loadTable(database("dfs://NoiseDB"),"noise")
select * from noise 
where date=2022.01.01 and tenantId=1055 and deviceId=10067
order by ts desc
limit 100

# timer(10) select ...
Time elapsed: 24.33 ms

腳本的 where 條件語(yǔ)句中指定了分區(qū)列 date 和 tenantId 進(jìn)行過(guò)濾,便于 DolphinDB 系統(tǒng)通過(guò)分區(qū)剪枝快讀定位到對(duì)應(yīng)的分區(qū)。同時(shí)指定了數(shù)據(jù)庫(kù)的 sort key (deviceId) 作為過(guò)濾字段,利用 TSDB 的索引機(jī)制,可以快速定位到數(shù)據(jù)塊,并按時(shí)間順序取回最新的100條記錄。平均一次查詢耗時(shí)?2ms,未命中緩存的首次查詢耗時(shí)?14ms。

  • 案例2:查詢某個(gè)租戶所有設(shè)備最新?tīng)顟B(tài)
noise = loadTable(database("dfs://NoiseDB"),"noise")
select * from noise 
where date=2022.01.01 and tenantId=1055
context by deviceId
csort ts desc
limit 1

# timer(10) select ...
Time elapsed: 246.619 ms

該腳本在 where 條件語(yǔ)句中同樣指定了分區(qū)列以快速定位到對(duì)應(yīng)的數(shù)據(jù)分區(qū)。通過(guò) context by 子句來(lái)根據(jù)設(shè)備 ID 將數(shù)據(jù)進(jìn)行分組,每組數(shù)據(jù)通過(guò) csort 子句按時(shí)間倒序排列(考慮到物聯(lián)網(wǎng)存在消息亂序的情況,必須使用csort將數(shù)據(jù)按采集時(shí)間排序)。使用 limit 1 獲取每個(gè)窗口內(nèi)的最新的一條記錄,從而獲取該租戶當(dāng)日所有設(shè)備的最新?tīng)顟B(tài)。平均一次查詢耗時(shí)?25ms,首次查詢耗時(shí)?121ms。

  • 案例3:查詢某個(gè)設(shè)備5分鐘內(nèi)的噪聲統(tǒng)計(jì)值
noise = loadTable(database("dfs://NoiseDB"),"noise")
select
     min(ts) as startTs
    ,max(ts) as endTs
    ,max(soundPressureLevel)
    ,avg(soundPressureLevel)
    ,max(soundPowerLevel) 
    ,avg(soundPowerLevel) 
from noise
where date=2022.01.01 and tenantId=1055 and deviceId=10067 and ts between 2022.01.01T00:50:15.518:2022.01.01T00:55:15.518
group by tenantId, deviceId

# timer(10) select ...
Time elapsed: 22.168 ms

該腳本首先根據(jù) where 指定的過(guò)濾條件定位并掃描數(shù)據(jù)塊,取出對(duì)應(yīng)時(shí)間段的數(shù)據(jù),并按 tenantId, deviceId 進(jìn)行聚合計(jì)算,以獲取聲音分貝、功率的統(tǒng)計(jì)值。平均一次查詢耗時(shí)?2ms,首次查詢耗時(shí)?13ms。

  • 案例4:查詢某個(gè)設(shè)備最近一天的明細(xì)數(shù)據(jù)
noise = loadTable(database("dfs://NoiseDB"),"noise")
select *
from noise
where date=2022.01.01 and tenantId=1055 and deviceId=10067
order by ts

# timer(10) select ...
Time elapsed: 23.261 ms

該腳本首先根據(jù) where 指定的過(guò)濾條件定位并掃描數(shù)據(jù)塊,取出對(duì)應(yīng)時(shí)間段的明細(xì)數(shù)據(jù),并按采集時(shí)間排序。平均一次查詢耗時(shí)?2ms,首次查詢耗時(shí)?16ms。

:首次查詢指未命中數(shù)據(jù)庫(kù)緩存及操作系統(tǒng)緩存的查詢。

4 對(duì)比測(cè)試

進(jìn)一步測(cè)試 DolphinDB TSDB 引擎與 OLAP 引擎,以及 ClickHouse MergeTree 引擎在上述數(shù)據(jù)集的時(shí)序查詢性能。測(cè)試過(guò)程中盡可能地保持環(huán)境變量相同,以保證科學(xué)有效。具體測(cè)試腳本詳見(jiàn)附錄。

4.1 測(cè)試環(huán)境

  • 測(cè)試機(jī)器配置

操作系統(tǒng):CentOS 7

CPU: 2 cores

內(nèi)存:10 G

磁盤(pán):SSD

  • 核心測(cè)試參數(shù)

對(duì)測(cè)試中影響性能的關(guān)鍵參數(shù),保持對(duì)等一致。

軟件信息 核心參數(shù) 庫(kù)表設(shè)計(jì)
DolphinDB:2.00.6 單節(jié)點(diǎn) memSize=8G TSDB引擎 / OLAP引擎 partitioned by tenantId, datesortColumns = [deviceId,ts]
ClickHouse:22.6.1 單節(jié)點(diǎn) max_server_memory_usage=8GMergeTree引擎 partition by tenantId, dateorder by deviceId, ts

測(cè)試時(shí),DolphinDB 和 ClickHouse 均采用單節(jié)點(diǎn),并分配 8G 最大內(nèi)存。在引擎方面,DolphinDB TSDB 引擎,ClickHouse MergeTree 引擎的內(nèi)部實(shí)現(xiàn)都采用了 LSM-tree。并保持庫(kù)表設(shè)計(jì)完全一致。

  • 時(shí)間衡量標(biāo)準(zhǔn)

由于端到端的時(shí)間,容易受到網(wǎng)絡(luò)抖動(dòng)和客戶端實(shí)現(xiàn)性能的影響,因此本次測(cè)試的測(cè)量時(shí)間設(shè)定為從查詢引擎接收到請(qǐng)求至計(jì)算出結(jié)果為止。

性能超越 Clickhouse | 物聯(lián)網(wǎng)場(chǎng)景中的毫秒級(jí)查詢案例,clickhouse,物聯(lián)網(wǎng),時(shí)序數(shù)據(jù)庫(kù),iot,database,數(shù)據(jù)分析,數(shù)據(jù)庫(kù)

4.2 測(cè)試結(jié)果

三者的具體測(cè)試結(jié)果為下表,表中數(shù)值為平均耗時(shí)/首次查詢耗時(shí)(單位 ms),平均耗時(shí)的計(jì)算邏輯為:

平均耗時(shí) = ( 首次耗時(shí) + 9次緩存命中耗時(shí) )/ 10

測(cè)試用例 場(chǎng)景 DolphinDB TSDB DolphinDB OLAP ClickHouse
case1 查詢某個(gè)設(shè)備最新100 條記錄 2 / 14 34 / 51 14 / 150
case2 查詢某個(gè)租戶所有設(shè)備的最新?tīng)顟B(tài) 25 /121 62 / 170 73 / 400
case3 查詢某個(gè)設(shè)備 5min的噪聲統(tǒng)計(jì)值 2 / 13 15 / 136 12 / 82
case4 查詢某個(gè)設(shè)備最近一天的明細(xì)數(shù)據(jù) 2 / 16 24 / 220 22 / 200

可以看出,OLAP 引擎和 ClickHouse 在不同的查詢場(chǎng)景下性能各有其優(yōu)勢(shì)和劣勢(shì)。

而 TSDB 引擎性能均優(yōu)于 ClickHouse,在相對(duì)復(fù)雜的點(diǎn)查場(chǎng)景性能差距更大。在場(chǎng)景4下 ,DolphinDB TSDB 引擎比 ClickHouse 的性能高 12.5 倍,首次查詢高13倍。在該場(chǎng)景中,TSDB 引擎需要讀取對(duì)應(yīng)設(shè)備的10000條記錄,壓縮后的存儲(chǔ)大小約為90K。存儲(chǔ)在6個(gè)連續(xù)的Block中,讀取效率非常高效。而 ClickHouse 則是 scan 了該分區(qū)下1000000條記錄的數(shù)據(jù)塊,因此兩者的首次查詢性能差距較大,而緩存后的性能差距主要取決于兩者在計(jì)算性能上的差別 。

5 總結(jié)

DolphinDB TSDB 引擎在物聯(lián)網(wǎng)場(chǎng)景有著卓越的點(diǎn)查性能,可以以毫秒級(jí)延時(shí)迅速響應(yīng)設(shè)備的狀態(tài)信息,其性能更優(yōu)于 ClickHouse 的 MergeTree 引擎。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-723383.html

6 附錄

  • DolphinDB 腳本
  • ClickHouse 腳本

到了這里,關(guān)于性能超越 Clickhouse | 物聯(lián)網(wǎng)場(chǎng)景中的毫秒級(jí)查詢案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(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)文章

  • 大數(shù)據(jù)場(chǎng)景下clickhouse查詢時(shí)長(zhǎng)優(yōu)化sop

    ClickHouse的優(yōu)化需要結(jié)合實(shí)際的數(shù)據(jù)特點(diǎn)和查詢場(chǎng)景,從多個(gè)方面進(jìn)行綜合優(yōu)化,以提高系統(tǒng)的性能和可靠性。 數(shù)據(jù)模型設(shè)計(jì) :在使用ClickHouse之前,需要充分考慮數(shù)據(jù)模型的設(shè)計(jì),因?yàn)閿?shù)據(jù)模型的設(shè)計(jì)對(duì)查詢性能有很大的影響。通常來(lái)說(shuō),ClickHouse適合存儲(chǔ)大量的、高維度的

    2024年02月16日
    瀏覽(23)
  • 優(yōu)化索引粒度參數(shù)提升ClickHouse查詢性能

    當(dāng)對(duì)高基數(shù)列進(jìn)行過(guò)濾查詢時(shí),總是希望盡可能跳過(guò)更多的行。否則需要處理更多數(shù)據(jù)、需要更多資源。ClickHouse缺省在MergeTree表讀取8192行數(shù)據(jù)塊,但我們可以在創(chuàng)建表時(shí)調(diào)整該 index_granularity 參數(shù)。本文通過(guò)示例說(shuō)明如何調(diào)整該參數(shù)優(yōu)化查詢性能。 下面示例,創(chuàng)建表并插入

    2024年02月11日
    瀏覽(20)
  • 從 Clickhouse 到 Apache Doris:有贊業(yè)務(wù)場(chǎng)景下性能測(cè)試與遷移驗(yàn)證

    從 Clickhouse 到 Apache Doris:有贊業(yè)務(wù)場(chǎng)景下性能測(cè)試與遷移驗(yàn)證

    本文導(dǎo)讀: 當(dāng)前,電商運(yùn)營(yíng)的主要痛點(diǎn)不僅來(lái)自多變的市場(chǎng)和客戶需求,也受困于碎片化用戶觸達(dá)等帶來(lái)的競(jìng)爭(zhēng)與挑戰(zhàn)。為了深度挖掘用戶價(jià)值、培養(yǎng)用戶忠誠(chéng)度、實(shí)現(xiàn)業(yè)績(jī)?cè)鲩L(zhǎng),有贊為商家搭建了全方位 OLAP 分析系統(tǒng),提供實(shí)時(shí)與離線分析報(bào)表、智能營(yíng)銷與人群圈選等 S

    2024年02月09日
    瀏覽(23)
  • ClickHouse為何能超越Elasticsearch?

    ClickHouse為何能超越Elasticsearch?

    Elasticsearch是一個(gè)強(qiáng)大的分布式全文檢索和數(shù)據(jù)分析引擎,也是日志分析系統(tǒng)經(jīng)常使用的一種實(shí)現(xiàn)方案,但近年來(lái)隨著ClickHouse的發(fā)展,Elasticsearch在日志分析領(lǐng)域的地位逐漸被取代,許多公司已經(jīng)將自己的日志分析解決方案從ES遷移到了ClickHouse,比如阿里、bilibili、快手等公司

    2024年02月05日
    瀏覽(18)
  • 物聯(lián)網(wǎng)場(chǎng)景中的邊緣計(jì)算解決方案有哪些?

    物聯(lián)網(wǎng)場(chǎng)景中的邊緣計(jì)算解決方案有哪些?

    在物聯(lián)網(wǎng)場(chǎng)景中,邊緣計(jì)算是一種重要的解決方案,用于在物聯(lián)網(wǎng)設(shè)備和云端之間進(jìn)行實(shí)時(shí)數(shù)據(jù)處理、分析和決策。HiWoo Box作為工業(yè)邊緣網(wǎng)關(guān)設(shè)備,具備邊緣計(jì)算能力,包括單點(diǎn)公式計(jì)算、Python腳本編程以及規(guī)則引擎,它為物聯(lián)網(wǎng)場(chǎng)景中的邊緣計(jì)算提供了多種解決方案。 物聯(lián)

    2024年02月15日
    瀏覽(19)
  • MySQL 中的 SQL 查詢性能調(diào)優(yōu)

    ????????通過(guò) MySQL 中的索引加速 SQL 查詢。安裝、分析查詢并使用存儲(chǔ)過(guò)程以獲得最佳結(jié)果。 ????????在本文中,我們將了解索引表列如何幫助提高 SQL 查詢的快速響應(yīng)時(shí)間。我們將介紹安裝 MySQL、創(chuàng)建存儲(chǔ)過(guò)程、分析查詢以及了解索引的影響的步驟。 ????????我在

    2024年02月12日
    瀏覽(25)
  • Elasticsearch如何做到數(shù)十億數(shù)據(jù)查詢毫秒級(jí)響應(yīng)?

    Elasticsearch如何做到數(shù)十億數(shù)據(jù)查詢毫秒級(jí)響應(yīng)?

    如果面試的時(shí)候碰到這樣一個(gè)面試題:ES 在數(shù)據(jù)量很大的情況下(數(shù)十億級(jí)別)如何提高查詢效率? 這個(gè)問(wèn)題說(shuō)白了,就是看你有沒(méi)有實(shí)際用過(guò) ES,因?yàn)樯??其?shí) ES 性能并沒(méi)有你想象中那么好的。 很多時(shí)候數(shù)據(jù)量大了,特別是有幾億條數(shù)據(jù)的時(shí)候,可能你會(huì)懵逼的發(fā)現(xiàn),跑

    2024年02月03日
    瀏覽(21)
  • <Java物聯(lián)網(wǎng)> 從主動(dòng)到被動(dòng):Java中的BACnet設(shè)備屬性查詢

    <Java物聯(lián)網(wǎng)> 從主動(dòng)到被動(dòng):Java中的BACnet設(shè)備屬性查詢

    目錄 BACnet 使用軟件 資源 模擬器 使用Java主動(dòng)查 ?引入maven 創(chuàng)建網(wǎng)絡(luò)對(duì)象 獲取遠(yuǎn)程設(shè)備 獲取設(shè)備屬性 使用DeviceEventAdapter訂閱 初始化本地BACnet設(shè)備和IP網(wǎng)絡(luò)配置: 啟動(dòng)本地設(shè)備和添加監(jiān)聽(tīng)器: 搜尋遠(yuǎn)程設(shè)備: 發(fā)送訂閱COV報(bào)文: 修改值并等待: SubscribeDevice監(jiān)聽(tīng)器: BACnet(

    2024年02月15日
    瀏覽(41)
  • EMQ X與RabbitMQ:MQTT消息服務(wù)器在物聯(lián)網(wǎng)中的性能對(duì)比

    在物聯(lián)網(wǎng)中,消息傳遞是實(shí)現(xiàn)設(shè)備之間通信的關(guān)鍵。MQTT(Message Queuing Telemetry Transport)作為一種輕量級(jí)的消息傳遞協(xié)議,被廣泛應(yīng)用于物聯(lián)網(wǎng)領(lǐng)域。EMQ X和RabbitMQ是兩個(gè)常見(jiàn)的MQTT消息服務(wù)器,它們?cè)谛阅芊矫嬗兴町?。本文將?duì)它們進(jìn)行性能對(duì)比,并提供相應(yīng)的源代碼。 EMQ

    2024年04月16日
    瀏覽(37)
  • ClickHouse(一):ClickHouse介紹及OLAP場(chǎng)景特征

    ClickHouse(一):ClickHouse介紹及OLAP場(chǎng)景特征

    目錄 1.?ClickHouse與其特性 ???????2.?什么是ClickHouse ???????3.?OLAP場(chǎng)景的特征 進(jìn)入正文前,感謝寶子們訂閱專題、點(diǎn)贊、評(píng)論、收藏!關(guān)注IT貧道,獲取高質(zhì)量博客內(nèi)容! 在大數(shù)據(jù)處理場(chǎng)景中,流處理和批處理使用到的技術(shù)大致如下: 批處理會(huì)將源業(yè)務(wù)系統(tǒng)

    2024年02月14日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包