精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

決戰日終:千萬級交易記錄對賬的性能優化實戰

數據庫 其他數據庫
運行數小時甚至通宵達旦,不僅浪費了寶貴的計算資源,更擠壓了問題排查和業務決策的時間。本文將深入探討,如何利用并行計算與內存數據庫這兩把利劍,將這場“持久戰”變為“閃電戰”。

對于任何一家涉及支付、金融或高頻交易的公司而言,“日終對賬”都是一個既關鍵又令人頭疼的環節。想象一下,銀行、支付平臺和商家各自記錄了當天發生的成千上萬筆交易。對賬,就是將這些海量記錄聚在一起,像一位一絲不茍的會計,逐筆核對,確?!澳阌械模乙灿?;你記的金額,和我記的金額一分不差”。

當交易量攀升至千萬級別,傳統的“一個腳本跑到底”的方式往往顯得力不從心。運行數小時甚至通宵達旦,不僅浪費了寶貴的計算資源,更擠壓了問題排查和業務決策的時間。本文將深入探討,如何利用并行計算與內存數據庫這兩把利劍,將這場“持久戰”變為“閃電戰”。

一、問題深潛:為什么傳統對賬方式會“慢”?

在討論優化之前,我們必須先搞清楚瓶頸所在。千萬級記錄的對賬,其核心挑戰可以歸結為兩個詞:比較和I/O(輸入/輸出)。

1. 海量的比較次數(時間復雜度爆炸)

最原始的對賬方法是嵌套循環比對:取銀行記錄A,遍歷所有支付平臺記錄看是否有匹配的;再取記錄B,重復上述過程。對于N條銀行記錄和M條平臺記錄,其時間復雜度是O(N*M)。當N和M都達到千萬級時,比較次數是10^7 * 10^7 = 10^14這個天文數字,任何單核CPU都無法在合理時間內完成。

2. 緩慢的磁盤I/O(等待的煎熬)

傳統數據庫(如MySQL、PostgreSQL)將數據存儲在硬盤上。當進行全表掃描或復雜關聯查詢時,系統需要頻繁地從磁盤讀取數據。磁盤的機械臂尋道速度與內存相比,慢了幾個數量級。大部分時間其實都浪費在了“等待數據從硬盤加載到內存”這一過程中。

一個簡單的比喻: 這就像你要在兩個巨大的、堆滿紙質文件的倉庫里找匹配的記錄。你(CPU)跑得再快,但每次對比都需要在兩個倉庫間來回奔跑取文件(磁盤I/O),效率自然極其低下。

二、破局之道一:并行計算——“人多力量大”的智慧

優化首先要解決的是“比較”問題。我們的目標是將一個大任務拆分成多個可以同時執行的小任務。

核心思路:分而治之

我們不再傻傻地進行全量比對,而是利用交易數據的特性(如交易時間、交易渠道、商戶號等)將其分割成多個獨立的子集。例如,我們可以按小時將對賬數據切成24份。9點到10點的銀行記錄,只需要和9點到10點的平臺記錄進行比對。這樣,原本一個O(N*M)的大問題,就變成了24個O(N/24 * M/24)的小問題。

而這24個小任務,完全可以并行執行!這就是并行計算的精髓。

技術選型與實踐:

1. 基于JVM的Fork/Join框架(Java)

Fork/Join是Java中用于并行執行任務的利器。它特別適合這種“分治”場景。

import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

// 假設我們有一條交易記錄
class Transaction {
    String id; // 交易唯一ID
    String time; // 交易時間,如 "2023-10-27 09:30:01"
    // ... 其他字段如金額、商戶號等
}

// 定義一個對賬任務,它繼承自RecursiveTask<對賬結果>
public class ReconciliationTask extends RecursiveTask<ReconciliationResult> {
    private List<Transaction> bankRecords;
    private List<Transaction> platformRecords;
    private static final int THRESHOLD = 50000; // 閾值,當數據量小于5萬時,不再拆分,直接計算

    public ReconciliationTask(List<Transaction> bankRecords, List<Transaction> platformRecords) {
        this.bankRecords = bankRecords;
        this.platformRecords = platformRecords;
    }

    @Override
    protected ReconciliationResult compute() {
        // 如果任務足夠小,直接執行比對
        if (bankRecords.size() <= THRESHOLD && platformRecords.size() <= THRESHOLD) {
            return doDirectReconciliation();
        } else {
            // 否則,進行任務拆分
            // 示例:按時間范圍簡單地對半拆分(實際生產環境會更復雜,比如按小時切分)
            int midBank = bankRecords.size() / 2;
            int midPlatform = platformRecords.size() / 2;

            ReconciliationTask leftTask = new ReconciliationTask(
                bankRecords.subList(0, midBank),
                platformRecords.subList(0, midPlatform)
            );
            ReconciliationTask rightTask = new ReconciliationTask(
                bankRecords.subList(midBank, bankRecords.size()),
                platformRecords.subList(midPlatform, platformRecords.size())
            );

            // 異步執行子任務
            leftTask.fork();
            rightTask.fork();

            // 等待子任務完成,并合并結果
            ReconciliationResult leftResult = leftTask.join();
            ReconciliationResult rightResult = rightTask.join();
            return mergeResults(leftResult, rightResult);
        }
    }

    private ReconciliationResult doDirectReconciliation() {
        // 這里是實際的比對邏輯
        // 通常會將一個列表轉為Map,以交易ID為Key,實現O(1)的查找
        Map<String, Transaction> platformMap = platformRecords.stream()
            .collect(Collectors.toMap(t -> t.id, t -> t));

        ReconciliationResult result = new ReconciliationResult();

        for (Transaction bankTx : bankRecords) {
            Transaction platformTx = platformMap.get(bankTx.id);
            if (platformTx != null) {
                // 匹配成功,進一步比較金額等細節
                if (/*金額等細節一致*/) {
                    result.addMatchedRecord(bankTx, platformTx);
                } else {
                    result.addAmountMismatchRecord(bankTx, platformTx);
                }
                // 從Map中移除,后續剩下的就是平臺獨有記錄
                platformMap.remove(bankTx.id);
            } else {
                result.addBankOnlyRecord(bankTx);
            }
        }
        // 平臺Map中剩下的記錄都是平臺獨有
        result.addPlatformOnlyRecords(platformMap.values());
        return result;
    }

    private ReconciliationResult mergeResults(ReconciliationResult r1, ReconciliationResult r2) {
        // 合并兩個子任務的結果
        // 簡單地將各種類型的記錄列表合并即可
        ReconciliationResult merged = new ReconciliationResult();
        merged.getMatchedRecords().addAll(r1.getMatchedRecords());
        merged.getMatchedRecords().addAll(r2.getMatchedRecords());
        // ... 合并其他如錯配記錄、單邊記錄等
        return merged;
    }
}

// 使用方式
ForkJoinPool forkJoinPool = new ForkJoinPool(); // 默認使用CPU核心數級別的線程數
ReconciliationTask mainTask = new ReconciliationTask(allBankRecords, allPlatformRecords);
ReconciliationResult finalResult = forkJoinPool.invoke(mainTask);

2. Spark等分布式計算框架(大數據量終極方案)

當單機內存也無法容納所有數據,或者需要更強大的容錯和管理能力時,Apache Spark是更優選擇。Spark的核心概念是彈性分布式數據集(RDD),它能將數據分布到集群的多臺機器上,并進行并行計算。
Scala偽代碼示意:

val bankRdd: RDD[(String, Transaction)] = sc.parallelize(bankRecords).map(tx => (tx.id, tx))
val platformRdd: RDD[(String, Transaction)] = sc.parallelize(platformRecords).map(tx => (tx.id, tx))

// 內連接,得到匹配的記錄
val matchedRdd: RDD[(String, (Transaction, Transaction))] = bankRdd.join(platformRdd)

// 左外連接,然后過濾出平臺為None的,得到銀行單邊記錄
val bankOnlyRdd: RDD[(String, Transaction)] = bankRdd.leftOuterJoin(platformRdd)
                                          .filter { case (id, (bankTx, platformTxOpt)) => platformTxOpt.isEmpty }
                                          .map { case (id, (bankTx, _)) => (id, bankTx) }

// 同理可得平臺單邊記錄
val platformOnlyRdd: RDD[(String, Transaction)] = platformRdd.leftOuterJoin(bankRdd)
                                            .filter { ... }
                                            .map { ... }

Spark的優勢在于它透明地處理了數據分布、任務調度和故障恢復,讓開發者可以像編寫單機程序一樣處理海量數據。

? 思路: 將銀行記錄和平臺記錄都加載為RDD。

? 通過 join 操作,根據交易ID將兩個RDD關聯起來,這個過程是分布式并行執行的。

? 過濾出匹配的記錄、僅存在于銀行RDD的記錄(銀行單邊)、僅存在于平臺RDD的記錄(平臺單邊)。

三、破局之道二:內存數據庫——“讓數據住在CPU旁邊”

解決了“計算”問題,我們再來解決“I/O”瓶頸。答案就是把數據從慢速的硬盤,搬到超高速的內存中。

什么是內存數據庫?
顧名思義,內存數據庫是一種主要依靠內存來存儲數據的數據庫管理系統(DBMS)。代表性的有Redis(鍵值存儲)、MemSQL(現在叫SingleStore)、VoltDB以及MySQL的內存引擎等。

為什么它能極大提升速度?

? 內存訪問速度是磁盤訪問速度的10^5 ~ 10^6倍(納秒級 vs 毫秒級)。

? 省去了傳統的SQL解析、查詢優化器、執行計劃生成等開銷(對于特定場景,這些可能是冗余的)。

在對賬中的具體應用:

1. 作為高速緩存(Cache)

這是最常見的用法。在開始對賬前,先將支付平臺的千萬條記錄從關系型數據庫(如MySQL)中預加載到Redis這樣的內存數據庫中。比對時,程序直接從Redis中根據交易ID獲取記錄,速度極快。
示例:使用Redis

// 數據預熱階段:將平臺記錄灌入Redis
Jedis jedis = new Jedis("redis-host");
for (Transaction tx : allPlatformTransactions) {
    // 以交易ID為Key,將交易對象序列化為JSON字符串存儲
    jedis.set(tx.getId(), objectMapper.writeValueAsString(tx));
}

// 對賬階段:遍歷銀行記錄,從Redis中查詢匹配項
for (Transaction bankTx : allBankTransactions) {
    String platformTxJson = jedis.get(bankTx.getId());
    if (platformTxJson != null) {
        Transaction platformTx = objectMapper.readValue(platformTxJson, Transaction.class);
        // 進行細節比對...
    } else {
        // 銀行單邊賬
    }
}

為了進一步提升緩存讀取效率,可以使用Redis的管道(Pipeline) 技術,將多個GET請求打包一次性發送,減少網絡往返開銷。

2. 作為主對賬數據庫

更徹底的方案是,直接使用支持SQL的內存數據庫(如SingleStore)。你可以將銀行和平臺的對賬文件直接導入到內存數據庫的兩張表中,然后執行一條標準的SQL關聯查詢語句:

SELECT b.id, p.id, b.amount, p.amount
FROM bank_transactions b
FULL OUTER JOIN platform_transactions p ON b.id = p.id
WHERE b.amount != p.amount OR b.id IS NULL OR p.id IS NULL;

這條SQL能一次性找出所有金額不匹配的記錄、銀行單邊記錄和平臺單邊記錄。由于整個Join操作都在內存中進行,其速度遠超基于磁盤的數據庫。

四、終極組合拳:并行計算 + 內存數據庫

最優的方案是將兩者結合,發揮1+1>2的效應。

架構流程圖示意:

[對賬文件] -> [數據預處理] -> [按Key(如小時)分片]
                                      |
                                      v
              [內存數據庫 / 分布式內存(如Spark)] <-- 并行計算任務注入
                                      |
                                      v
        [Task 1: 處理9點數據]   [Task 2: 處理10點數據]  ... [Task N]
                                      |
                                      v
                              [合并所有任務結果]
                                      |
                                      v
                        [生成對賬報告:平、不平、單邊]

步驟詳解:

1. 數據預處理與分片: 將原始的銀行和平臺對賬文件進行清洗、格式化,并按照相同的規則(例如交易時間的每小時一個分區)進行分片。

2. 加載至內存: 將這些分片數據加載到內存中。這可以是在Spark集群的分布式內存里,也可以是每個并行任務獨立訪問的一個中心化內存數據庫(如Redis Cluster)中。

3. 并行任務執行: 主程序(或Spark Driver)啟動多個并行 worker(線程或分布式節點)。每個worker被分配一個特定的數據分片(如“處理9點-10點的數據”)。

4. 分片內高效比對: 每個worker只處理自己分片內的數據。它從內存中高速讀取屬于該分片的銀行和平臺記錄,在內存中進行關聯比對(使用Hash Join等方式)。

5. 結果匯總: 所有worker完成自己分片的對賬后,將結果(匹配列表、不匹配列表等)返回給主程序進行匯總,最終生成完整的對賬報告。

五、其他優化技巧與注意事項

? 索引是靈魂: 即使在內存中,如果沒有索引,查找依然是O(N)的線性掃描。務必對關聯鍵(交易ID、時間)建立哈希索引或樹形索引。

? 數據序列化: 選擇高效的序列化方案(如Protobuf、Avro)來減少內存占用和網絡傳輸開銷。

? 異步I/O: 在數據加載階段,使用異步非阻塞I/O可以避免線程空閑等待,充分利用CPU。

? 緩存預熱策略: 在對賬任務開始前完成所有數據的加載,避免在對賬過程中出現緩存擊穿。

? 資源權衡: 內存資源比磁盤昂貴。需要根據數據量和對賬時效性要求,找到成本和性能的最佳平衡點。

六、總結

面對千萬級乃至億級的日終對賬挑戰,我們不能停留在“腳本+關系數據庫”的原始時代。通過深入分析瓶頸,我們找到了兩條清晰的優化路徑:

? 并行計算將浩大的工程分解為協同作戰的小分隊,充分利用多核CPU或分布式集群的計算能力,解決了“算得慢”的問題。

? 內存數據庫將數據置于距離CPU最近的地方,消除了磁盤I/O這個最大的性能枷鎖,解決了“等得久”的問題。

將二者結合,構建一個“分片-內存加載-并行比對-結果匯總”的流水線,是經過實戰檢驗的高效對賬架構。這種優化思路,不僅適用于金融對賬,對于任何需要海量數據匹配、比對、關聯分析的場景(如用戶畫像匹配、日志分析、風控規則碰撞等)都具有極高的參考價值。技術的價值,正是在于將不可能變為可能,將漫長的等待變為瞬間的反饋。

責任編輯:武曉燕 來源: 程序員秋天
相關推薦

2025-03-31 01:55:00

2022-02-28 10:11:22

查詢數據SQL

2017-02-20 20:04:05

系統超輕量日志實現

2009-04-20 08:51:50

MySQL查詢優化數據庫

2017-03-29 14:44:20

網絡性能優化

2022-05-17 09:02:30

前端性能優化

2022-07-17 06:54:51

Eureka架構

2025-03-24 10:51:28

2024-11-12 11:57:08

2022-07-07 09:33:06

MySQL查詢數據優化

2022-01-27 08:14:54

數據優化讀寫分離

2010-11-15 14:58:17

Oracle千萬級記錄

2019-06-05 14:30:21

MySQL數據庫索引

2019-12-13 10:25:08

Android性能優化啟動優化

2024-06-19 09:38:05

2017-10-24 10:15:05

CDN突發池系統架構

2015-05-30 10:04:24

線下公開課51CTO沙龍MDSA

2018-05-09 14:45:50

蘇寧前端Nodejs

2018-10-19 12:47:35

MySQLSQL優化數據庫

2018-05-13 22:23:32

點贊
收藏

51CTO技術棧公眾號

1024免费在线视频| 波多野结衣视频观看| 91亚洲免费视频| 无码视频在线观看| 99久久99久久精品国产片果冰| 欧美丰满美乳xxx高潮www| a级网站在线观看| 深爱五月激情五月| 蜜臂av日日欢夜夜爽一区| 欧美成人全部免费| 极品粉嫩小仙女高潮喷水久久| 激情小说亚洲| 午夜精品福利一区二区蜜股av| 亚欧洲精品在线视频免费观看| 国产成人久久精品77777综合 | 亚洲色图偷窥自拍| 日本中文字幕在线不卡| av资源亚洲| 亚洲精品乱码久久久久久久久| 欧美福利精品| 亚洲男人天堂久久| 久久av资源站| 日本成人黄色片| 国产午夜久久久| 91精品精品| 亚洲天堂影视av| 99re久久精品国产| 亚洲三级av| 欧美日韩国产高清一区| 可以免费观看av毛片| 密臀av在线| 综合欧美亚洲日本| 日韩午夜视频在线观看| 污污网站免费在线观看| 高清shemale亚洲人妖| 成人美女av在线直播| 波多野结衣电影在线播放| 在线综合亚洲| 久久久免费av| 日韩av黄色在线观看| 亚洲国产综合av| 四虎国产精品成人免费影视| 一本一本大道香蕉久在线精品 | 欧美aaa级片| 国产日产精品_国产精品毛片| 日韩欧美综合在线| 三级av免费看| 日本午夜免费一区二区| 欧美性感一区二区三区| 国产又大又黄又粗的视频| 成人av观看| 色爱区综合激月婷婷| 毛片av免费在线观看| 成人免费无遮挡| 一本大道综合伊人精品热热| 欧美少妇性生活视频| 超薄肉色丝袜脚交一区二区| 色成年激情久久综合| 国产理论在线播放| 精品福利在线| 欧美一区日本一区韩国一区| 被黑人猛躁10次高潮视频| 欧美视频精品全部免费观看| 欧美mv日韩mv亚洲| 亚洲av成人片无码| 自拍偷拍欧美一区| 在线看福利67194| 午夜国产福利视频| 一区二区三区四区日韩| 欧美激情伊人电影| 九九热精品视频在线| 日韩成人dvd| 成人精品福利视频| 国产91久久久| 久久久99精品久久| 日本高清不卡一区二区三| 国产小视频免费在线网址| 亚洲国产精品成人综合色在线婷婷| 亚洲欧美日韩精品久久久| av大全在线| 精品成人国产在线观看男人呻吟| 亚洲国产精品毛片av不卡在线| 成人免费在线观看视频| 亚洲日日夜夜| 在线观看日韩国产| 日韩欧美中文视频| 蜜桃久久久久| 中文字幕欧美日韩va免费视频| 黄色录像免费观看| aa国产精品| 国产欧美精品一区二区三区-老狼| av中文字幕播放| 91麻豆福利精品推荐| 在线观看成人av电影| 1234区中文字幕在线观看| 91精品福利在线| 精品人妻无码中文字幕18禁| 美日韩中文字幕| 色在人av网站天堂精品| 69亚洲精品久久久蜜桃小说| 国产麻豆日韩欧美久久| 欧美高清视频一区二区三区在线观看| 黄色网页在线观看| 色噜噜偷拍精品综合在线| 精产国品一二三区| 欧美日韩一区二区综合| 欧美激情一级二级| 91 中文字幕| 久久久久久黄色| 国产尤物av一区二区三区| 91综合国产| 亚洲国产精品电影| 欧美国产日韩在线观看成人| 日av在线不卡| 久久成人资源| 国内老司机av在线| 欧美日韩二区三区| 九九九视频在线观看| 亚洲一区网站| 成人区精品一区二区| 国产激情在线观看| 欧洲在线/亚洲| 素人fc2av清纯18岁| 欧美日韩影院| 91精品在线观| 自拍视频在线免费观看| 色嗨嗨av一区二区三区| 久久国产精品无码一级毛片| 亚洲高清二区| 成人av免费电影| a级在线观看| 欧美日韩国产天堂| 99热都是精品| 国产一级av毛片| 免费成人美女在线观看.| 蜜桃网站成人| 中国字幕a在线看韩国电影| 亚洲精品一区二区三区影院| 激情五月少妇a| 国产综合一区二区| 一区中文字幕在线观看| 国产精品久久久久久久久久齐齐| 亚洲人精品午夜在线观看| 国产香蕉视频在线| www..com久久爱| 波多野结衣综合网| 久久动漫网址| 欧美在线观看一区二区三区| 天天干天天摸天天操| 亚洲成人免费在线| 成年人的黄色片| 一区二区激情| 欧美一区二区三区成人久久片| 鲁鲁在线中文| 亚洲欧美在线一区| 五月婷婷激情五月| 国产精品免费看片| 亚洲免费成人在线视频| 欧美在线日韩| 国产精品一区二区三区在线| 福利在线免费视频| 亚洲乱码国产乱码精品精天堂| 久久久国产精品成人免费| 久久亚洲精品国产精品紫薇| 欧美日韩第二页| 日本午夜一区| 亚洲一区二区三区视频播放| 色爱综合区网| 精品伊人久久97| 一级片在线免费播放| 亚洲欧美影音先锋| 性高潮免费视频| 国产精品综合| 亚洲免费在线精品一区| 久久三级中文| 91成人在线播放| 2019中文字幕在线视频| 日韩色视频在线观看| av网站中文字幕| 1区2区3区国产精品| 涩视频在线观看| 奇米在线7777在线精品| 2021国产视频| 亚洲区小说区图片区qvod按摩| 国产精品久久久久久久午夜| 亚洲国产精品精华素| 日韩av网站大全| 日本不卡视频在线播放| 亚洲第一大网站| 色综合中文字幕| av免费播放网站| 成人深夜在线观看| 男女无套免费视频网站动漫| 国模大胆一区二区三区| 日韩欧美精品一区二区| 第一区第二区在线| 国产精品偷伦视频免费观看国产| 欧美videosex性极品hd| 亚洲视频一区二区三区| 亚洲第一色网站| 色老头久久综合| 国产真实夫妇交换视频| 中文字幕乱码一区二区免费| 北京富婆泄欲对白| 久久精品国产精品亚洲精品| 国产乱子伦农村叉叉叉| 欧美精品一区二区三区久久久竹菊| 蜜桃传媒视频麻豆第一区免费观看| 国产电影一区二区| 国产精品狠色婷| 男女羞羞在线观看| 欧美精品免费在线| 日韩av中文| 亚洲日本aⅴ片在线观看香蕉| 高h放荡受浪受bl| 欧美日本精品一区二区三区| 久久中文字幕免费| 亚洲一区在线观看网站| 自拍偷拍第9页| 国产午夜久久久久| 水蜜桃av无码| 国产91在线看| 青娱乐国产精品视频| 蜜臀久久99精品久久久久久9| 无码人妻丰满熟妇区96| 激情另类综合| 99热这里只有精品免费| 99热在线成人| 一区二区不卡在线| 成人午夜国产| 色综合久久av| 欧美三级情趣内衣| 欧美一区视久久| 天堂av一区二区三区在线播放| 鬼打鬼之黄金道士1992林正英| 国产一区二区在线观| 成人在线免费观看视视频| 丰满少妇一区| 欧美在线视频导航| 成人片免费看| 国产精品成人av性教育| 国产一区一一区高清不卡| 国产精品www色诱视频| 欧美电影网站| 国产精品91在线| 日韩欧美少妇| av电影在线观看不卡| 国产喷水theporn| 免费观看30秒视频久久| 亚洲精品久久久中文字幕| 免费视频一区二区| 欧美日韩中文不卡| 韩国av一区二区三区| 亚洲一级片av| 丰满白嫩尤物一区二区| 第四色在线视频| 久久久久99精品国产片| 成人激情五月天| 国产精品久久一级| 国产免费无码一区二区视频| 亚洲最大成人综合| 国产网友自拍视频| 日韩欧美一区视频| 亚洲国产无线乱码在线观看| 欧美福利视频一区| 精品国产18久久久久久| 亚洲国内精品视频| 国产视频在线看| www.欧美免费| 国产福利在线免费观看| 国产69久久精品成人| 91大神在线观看线路一区| 成人日韩av在线| 成人h动漫精品一区二区器材| 国产手机精品在线| 国产日产一区| 超碰超碰超碰超碰超碰| 日韩视频一区| 亚洲精品久久久久久宅男| 风流少妇一区二区| 伊人网伊人影院| 亚洲欧美视频在线观看视频| 日韩人妻无码一区二区三区99 | 妞干网在线观看视频| 久久精品在线| 免费看的av网站| 久久久久久久精| 国产精品成人免费观看| 色94色欧美sute亚洲13| 国产高清第一页| 亚洲欧美日韩网| 青青草原av在线| 国产999在线| 日韩视频免费观看高清在线视频| 中文字幕一区二区人妻视频| 91精品国产色综合久久不卡电影| 欧美一区二不卡视频| 丝袜美腿精品国产二区| 福利在线导航136| 国产精品网址在线| 欧美美女黄色| 国产高清免费在线| 另类亚洲自拍| 性活交片大全免费看| 国产精品久久久久久久久图文区 | 精品国产人妻一区二区三区| 中文字幕一区二区三区乱码在线| 欧美日韩电影一区二区| 日韩电影免费观看| 国产精品一区二区性色av| 日韩成人av在线资源| 日本道在线视频| 日本不卡在线视频| 成人免费看aa片| 亚洲综合在线视频| 国产绿帽刺激高潮对白| 一道本无吗dⅴd在线播放一区 | 国产精品久久久久久久av大片| 国产精伦一区二区三区| 97精品国产97久久久久久粉红| 日韩精品亚洲专区| jlzzjizz在线播放观看| 亚洲一区二区在线视频| 国产成人麻豆精品午夜在线 | 国产在线天堂www网在线观看| 川上优av一区二区线观看| av一区二区在线观看| 欧美三级一级片| 99re成人精品视频| 在线免费观看毛片| 精品国产123| 国产后进白嫩翘臀在线观看视频| 1卡2卡3卡精品视频| 91成人观看| 日本r级电影在线观看| 亚洲欧美日韩国产手机在线| aaaa一级片| 毛片精品免费在线观看| 美女久久精品| 青青在线免费视频| 国产麻豆视频一区| 欧美成人aaa片一区国产精品| 91精品欧美久久久久久动漫| 国产高清一区二区三区视频| 亚洲aⅴ男人的天堂在线观看| 亚洲成av人电影| 国产成人精品一区二区在线小狼| 亚洲专区一二三| 亚洲欧美自偷自拍| 欧美在线精品免播放器视频| 国产99亚洲| 日本a√在线观看| 中文字幕在线不卡国产视频| 国产精品国产三级国产普通话对白| 日韩小视频在线| 亚洲精品aⅴ| 草草视频在线免费观看| 91在线观看一区二区| 夜夜爽妓女8888视频免费观看| 在线观看中文字幕亚洲| 精品国产亚洲一区二区三区大结局 | 亚洲无线码一区二区三区| 天堂影院在线| 国产精品久久久久av| 综合激情一区| 最近日本中文字幕| 在线观看一区二区视频| 久久亚洲天堂| 国产精品视频入口| 日精品一区二区三区| 蜜桃av噜噜一区二区三| 亚洲伦伦在线| 卡一卡二卡三在线观看| 99久久er| 日本免费高清不卡| 久久99国产精品久久99| 久久久精品视频在线| 国产视频亚洲精品| 老司机精品视频网| 日韩国产成人无码av毛片| 99久久精品国产一区| 中文字幕一区二区在线视频 | 国产亚洲精品成人| 亚洲欧美中文另类| 国产一区二区三区视频在线 | 精品一区二区在线观看| 久久精品国产亚洲av香蕉| 亚洲午夜小视频| 久久久91麻豆精品国产一区| 日本三级免费网站| 亚洲视频一二三区| 日韩午夜影院| 亚洲影院高清在线| 日韩中文字幕一区二区三区| 欧美国产在线看| 一道本无吗dⅴd在线播放一区| 最新国产一区二区| 国产成人美女视频| 一本高清dvd不卡在线观看| 青青青草视频在线|