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

空間換時間-將查詢數據性能提升100倍的計數系統實踐

開發
對于企業和平臺而言,計數系統能夠提供一個有效的量化依據,幫助優化產品、制定營銷策略、提升用戶體驗,因此它成為了數據統計和用戶分析的核心工具。

1 背景

俠客匯的業務運營,根據目前公司的業務體量和運營方式,結合市場上對標競品的DAU數據分析,再借鑒國際上有很多會員制的自由交易市場玩法,決定建立一個B2B的二手同行自由交易平臺。通過提供擔保交易能力,讓所有交易能在平臺內完成閉環,平臺通過真實數據為商戶提供信息認證,打造具有公信力的背書。通過推薦和風控能力形成護城河,讓用戶留在平臺,實現合作共贏。

2 前言

在信息爆炸的時代,計數系統幾乎無處不在,從社交平臺上的點贊量、評論數,到電商平臺的瀏覽量、訂單數量,再到內容網站的訪問量統計,計數系統為各種業務提供了實時、準確的數據支持。這些數據不僅是簡單的數字,它們可以反映出用戶對內容的興趣、商品的受歡迎程度、市場的需求變化,甚至可以用于預測未來趨勢。對于企業和平臺而言,計數系統能夠提供一個有效的量化依據,幫助優化產品、制定營銷策略、提升用戶體驗,因此它成為了數據統計和用戶分析的核心工具。

3 需要統計的計數維度

3.1 按照統計內容維度劃分

  • 內容維度:用戶發帖數,帖子評論數,帖子點贊數,評論列表未讀總數,關注列表未讀總數,點贊列表未讀總數,評論點贊數,靠譜未讀計數,同行認證未讀計數,商品詳情瀏覽數量,商品負反饋數量。
  • 用戶維度:近期動態個數,用戶關注數,用戶粉絲數。
  • 交易維度:用戶回收單成交數,用戶送檢數,報價單計數,用戶B2B訂單賣出計數, 用戶B2B訂單買入計數,用戶發布商品計數,用戶已售商品計數,用戶已購商品計數。

3.2 按照統計時間維度劃分

  • 實時維度:上述內容維度的統計基本都是實時統計的維度。
  • 時間段維度:最近N天發布的商品數,最近N天售賣商品的數量,最近N天發布的帖子數等等。

具體案例:

1.個人主頁會有我關注的數量,關注我的數量,靠譜數量,交易數量,以及一系列的按時間段統計的跑馬燈數據。多數用戶維度相關的數據都是在個人中心的上半部分進行展示,而下半部分,則是對這個用戶內容維度,交易維度統計的一個匯總。同時,統計的數據,既有實時維度,也會有時間段維度,例如,我們會統計用戶的總的交易單量,也會統計這個用戶最近N天的交易數量。

圖片

2.在首頁找同行頁面,顧名思義,找同行頁面就是用來尋找用戶的,所以這個頁面會重點展示這個用戶在用戶維度的數據統計,同行關注數,交易人數,靠譜數等。

圖片

3.在自由市場頁面,我們同樣會重點展示這個用戶在用戶維度的數據統計,但是與此同時,我們還會展示他的交易評分,方便有需要的用戶,能夠多維度的篩選自己的交易伙伴。

圖片

4.在消息通知頁面,我們則著重統計這個用戶需要關注的動態數據,點贊數,評論數,新增關注數量等等。

圖片

4 為什么要做自己的計數系統

上面已經陳述了我們所需要的統計的計數業務場景,以及不同的統計維度和統計方式。簡單的將我們需要的計數功能做一個總結:

  • 基礎功能:能夠實時計算需要統計數量的總數,而且能夠批量查詢。
  • 拓展功能:能夠兼容不同的業務場景,而且能夠由業務方自己控制增減的數量。
  • 進階功能:能夠根據時間段進行查詢,而且時間段由業務方自由控制,支持不同的時間維度,分鐘,小時,天,周,月。

功能總結完成,從節省時間和資源的角度來說,公司的其他部門是不是已經有對應的功能可以提供了呢?我們首先想到的是數據組,畢竟數據組在整理和統計數據這方面是專業的。其次我們想到的是中臺系統,是不是有對應的功能可以直接提供。結果調研之后發現,兩個部門現有的功能,并不能完全支持我們的需求。

  • 數據組方面,能夠支持我們不同的業務場景的統計,也可以支持我們的時間段查詢。但是,數據組目前的數據提供方式是T+1的模式,并不能夠對我們的業務場景進行實時的統計。也就是說,他滿足了我們的拓展功能和進階功能,但是在基礎功能方面的支持是有限的。
  • 中臺方面,計數系統的功能是有的,但是功能相對簡單,由中臺來分配計數場景,然后由業務同學來驅動這個計數的加減。基礎功能,拓展功能全都支持,如果計數過期,還可以通過回源數據接口來取數據。但是對于根據時間段查詢,也就是我們需要的進階功能,并不支持。

基于以上調研結果,并沒有現有的功能能夠直接滿足我們所有的需求,我們只能自己來實現這個計數的功能。

5 計數系統的設計方案

既然已經決定要自己來做,那么就要從業務實際需要的業務場景來設計我們需要實現的功能。計數系統總的來說,實現我們所需要的功能并不是什么難點,設計方案的選擇,主要還是看我們自己的側重點,如果是開發時間角度考慮,可以選能夠快速實現功能的短期方案。如果是從長遠角度考慮,想讓計數系統獨立承擔一個類似中臺的角色,那也可以將計數系統作為一個獨立的通用模塊進行開發。

5.1 計數內置的架構設計

在前言中已經說過,本次開發是臨危受命,時間很緊張,那么如果想要在有效的時間內完成本次開發,時間是不可忽略的客觀條件。那么,最快速的方案莫過于直接采用count數據表+緩存的方式,這種方式在體量較小時,成本低、性能高、絕對精準,但隨著統計數據的體量逐漸變大、微服務拆分越來越細之后,該方案就會越來越難以支撐業務。

count表方案,基本可以總結為:

  • 一次請求多次查詢,for循環進行
  • 一次請求多次查詢,多個計數的查詢
  • 一次查詢一個count,每個計數都是一個count語句

所以這種方案一定會造成以下這幾種問題:

  • 性能瓶頸:隨著數據體量的越來越大,再用count的方式去進行數據統計,性能會變得越來越差。
  • 穩定性風險:如果業務統計規則變得越來越復雜,使用數據庫count的方式會使數據查詢語句越來越復雜,容易引發慢SQL從而導致數據庫不穩定。而且將計數的業務層和緩存與核心的業務邏輯放在一起,如果統計數據出現了問題,會影響核心業務的使用,小的問題會變成大的問題。
  • 一致性問題:部分計數場景下是定時更新緩存的策略,緩存操作和MySQL操作無法在一個事務中完成,會產生不一致的問題,且在越頻繁變更的場景下差異值就會越大。

綜上所屬,短期的方案雖然短小精悍,但是后期的隱患比較大,維護成本會很高,不是合理的選擇方案。

5.2 計數外置的架構設計

結合俠客匯當前的業務現狀、體量以及考慮中長期體量增長的規劃,我們也調研了業內比較常見的一些實現方案,最終決定單獨維護一套計數系統。由計數系統來統計俠客匯所有的計數邏輯,計數系統和具體的業務邏輯完全脫離,只負責統計各個業務場景的計數,具體的流程圖如下:圖片

5.2.1 計數方案中字段的定義

  • 全局計數器:記錄一個業務key的總量值,比如內容點贊總數,由一個全局計數器記錄即可。邏輯結構為(業務類型+實體id):value值。
  • 計數流水:實時上報的計數流水,可以支持按照精確時間維度查詢功能。
  • 業務類型:業務類型確定計數的接入業務,如交易單總量計數、內容點贊計數,為不同的接入業務類型。
  • 計數實體:實體id確定計數的目標對象,比如交易單、社區發布內容等為一個計數實體。實體id在同一業務類型內保證唯一性,如交易單總量計數業務,交易單id不能重復。圖片

之所以設計了這幾個字段,是因為我們可以通過最小的代價來實現最通用的功能。

  • 全局計數器必不可少,這是整個計數系統的靈魂,也是我們最常用的數據統計功能。
  • 計數流水是為了保存原始的數據,后期如果有任何數據遷移,或者數據丟失后需要回源數據的,計數流水都會最后的屏障。
  • 業務類型是為了兼容各個業務場景,如果沒有這個字段,那么每個業務場景我們都需要一個接口來進行統計,每個業務場景我們都需要一個表來保存數據,對后續拓展極為不利,也不能體現計數系統的通用性。
  • 計數實體的作用有兩個,一方面如果沒有實體id,只有業務類型的話,后續數據如果出現問題需要進行查詢的時候,我們無從查起。另一方面,有了計數實體,我們才能做一些冪等相關的校驗操作。

以上字段,同樣是redis的key的重要組成,redis的存儲實體如下圖

圖片

接下來說下計數系統的具體功能,我們對外提供的接口如下圖:

public interface BizCountService {
    /**
     * 計數上報接口
     *
     * @param request
     * @return
     */
    ZZOpenScfBaseResult<String> reportCount(ReportCountRequest request);

    /**
     * 流水記錄處理-保存日期計數的情況
     *
     * @param msg
     * @return
     */
    boolean saveDateOpt(BizCountRecordMsg msg);

    /**
     * 流水記錄處理-更新日期計數的情況
     *
     * @param heroBizCountDate
     * @param msg
     * @return
     */
    boolean updateDateOpt(HeroBizCountDate heroBizCountDate, BizCountRecordMsg msg);

    /**
     * 計數總量查詢接口
     *
     * @param request
     * @return
     */
    ZZOpenScfBaseResult<Long> total(TotalRequest request);

    /**
     * 批量查詢總量
     *
     * @param request
     * @return
     */
    ZZOpenScfBaseResult<CountBatchResponse> countBatch(CountBatchRequest request);

    /**
     * 清零接口
     * 總量置為0,插入一條計減當前總量的記錄;不影響歷史記錄查詢
     *
     * @param request
     * @return 重置前的舊值
     */
    ZZOpenScfBaseResult<Long> clear(ClearRequest request);

    /**
     * 按時間范圍計數接口
     *
     * @param request
     * @return
     */
    ZZOpenScfBaseResult<Long> countTimeBetween(CountTimeBetweenRequest request);

    /**
     * 批量id按時間范圍計數接口
     *
     * @param request
     * @return
     */
    ZZOpenScfBaseResult<Map<Long, Long>> batchCountTimeBetween(CountTimeBetweenBatchRequest request);

    /**
     * 最近n天的計數統計接口
     *
     * @param request
     * @return
     */
    ZZOpenScfBaseResult<Long> countRecent(CountRecentRequest request);

    /**
     * 批量-最近n天的計數統計接口
     *
     * @param request
     * @return
     */
    ZZOpenScfBaseResult<Map<Long, Long>> batchCountRecent(CountRecentBatchRequest request);

    /**
     * 組合計數總量查詢接口
     *
     * @param request
     * @return
     */
    Long combineTotal(CombineTotalRequest request);
}

我們整體的業務統計維度如下:

public enum BizCountType {

    /**
     * 用戶發帖數
     */
    USER_POST_COUNT("userPostCount","用戶發帖數"),
    /**
     * 帖子評論數
     */
    POST_REMARK_COUNT("postRemarkCount", "帖子評論數"),
    /**
     * 帖子點贊數
     */
    POST_APPROVE_COUNT("postApproveCount", "帖子點贊數"),
    /**
     * 評論列表未讀總數
     */
    REMARK_UNREAD_COUNT("remarkUnreadCount", "評論列表未讀總數"),
    /**
     * 關注列表未讀總數
     */
    ATTENTION_UNREAD_COUNT("attentionUnreadCount", "關注列表未讀總數"),
    /**
     * 點贊列表未讀總數
     */
    APPROVE_UNREAD_COUNT("approveUnreadCount", "點贊列表未讀總數"),
    /**
     * 評論點贊數
     */
    REMARK_APPROVE_COUNT("remarkApproveCount", "評論點贊數"),
    /**
     * 靠譜數
     */
    RELIABLE_COUNT("reliableCount", "靠譜數"),
    /**
     * 不靠譜數
     */
    UNRELIABLE_COUNT("unreliableCount", "不靠譜數"),
    /**
     * 近期動態個數
     */
    RECENT_COUNT("recentCount", "近期動態個數"),
    /**
     * 用戶回收單成交數
     */
    USER_RECYCLE_ORDER_COUNT("userRecycleOrderCount", "用戶回收單成交數"),
    /**
     * 用戶關注數
     */
    USER_ATTENTION_COUNT("userAttentionCount", "用戶關注數"),

    /**
     * 用戶粉絲數
     */
    USER_FOLLOWER_COUNT("userFollowerCount", "用戶粉絲數"),
    /**
     * 用戶送檢數
     */
    USER_SUBMISSION_COUNT("userSubmissionCount", "用戶送檢數"),

    /**
     * 報價單計數
     */
    PRICE_SHEET_COUNT("priceSheetCount", "報價單計數"),

    /**
     * 靠譜未讀計數
     */
    RELIABLE_UNREAD_COUNT("reliableUnreadCount", "靠譜未讀計數"),
    /**
     * 同行認證未讀計數
     */
    FELLOW_CERTIFICATE_UNREAD_COUNT("fellowCertificateUnreadCount", "同行認證未讀計數"),

    /**
     * 用戶B2B訂單賣出數
     */
    USER_B2B_ORDER_SOLD_COUNT("b2bOrderSoldCount", "用戶B2B訂單賣出計數"),

    /**
     * 用戶B2B訂單買入數
     */
    USER_B2B_ORDER_PURCHASE_COUNT("b2bOrderPurchaseCount", "用戶B2B訂單買入計數"),

    /**
     * 用戶發布商品數
     */
    USER_COMMODITY_PUBLISH_COUNT("userProductPublishCount", "用戶發布商品計數"),

    /**
     * 用戶已售商品數
     */
    USER_COMMODITY_SOLD_COUNT("userProductSoldCount", "用戶已售商品計數"),

    /**
     * 用戶已購買商品數
     */
    USER_COMMODITY_PURCHASE_COUNT("userProductPurchaseCount", "用戶已購商品計數"),
    /**
     * 商品詳情瀏覽數量
     */
    COMMODITY_BROWSE_COUNT("commodityBrowseCount", "商品詳情瀏覽數量"),
    /**
     * 商品負反饋數量
     */
    COMMODITY_NEGATIVE_FEEDBACK_COUNT("commodityNegativeFeedbackCount", "商品負反饋數量"),
    ;
    /**
     * 業務類型
     */
    private String code;
    /**
     * 業務描述
     */
    private String desc;

    public static BizCountType getByCode(String code) {
        return EnumParser.parse(BizCountType.class, BizCountType::getCode, code);
    }
}

5.2.2 計數系統的上報流程

在整個上報的流程中,主要分為三個部分,獲取上報數據,處理上報數據,上報數據持久化。

獲取上報數據

數據的獲取一般有兩種方式,通過接口或通過MQ的方式,本次我們采取的是直接接口調用的方式進行處理。

之所以考慮直接用接口調用的方式進行處理,主要考慮一下幾個方面:

  • 實時性高:直接接口調用通常是同步的,調用方可以立即獲得響應。
  • 實現簡單:接口調用往往更容易實現,不需要額外的消息隊列中間件配置和維護,減少了系統復雜度和運維成本。對于只需要簡單請求-響應模式的服務來說,接口調用通常是更簡單直接的選擇。
  • 調用順序明確:接口調用是同步的,天然保證了調用順序,特別適合一些需要嚴格順序的場景。而 MQ 消息可能會因為分區、并發消費等原因導致消息處理順序變化,不適用于需要嚴格順序的業務。
  • 性能開銷小:直接調用避免了消息的中間傳輸、序列化和反序列化的開銷,通常性能更優。
  • 調試方便:接口調用的流程更清晰,調試和問題排查更簡單。使用 MQ 消息時,涉及消息的存儲、轉發、消費等多個環節,排查問題時需要在消息隊列和消費端分別查看日志和狀態,調試難度更大。

處理上報數據

每個接口,會有一些邏輯上的校驗,例如,業務類型和實體id不能為空,不做其他的業務邏輯的校驗,保持計數系統的通用性,避免業務的侵入。

上報數據持久化

持久化部分主要分為兩塊,一是DB持久化,二是對于緩存的更新。

我們整體的流程是,將數據庫的變更和redis的緩存放在同一個事務中,優先更新數據庫,然后將計數流水發送mq消息,由另一個接口單獨進行流水統計,最后更新redis緩存,如果事務失敗的話,可以保證整體的一致性。至于數據的加減,由業務方來控制,加減的大小也由業務方來控制,我們只進行傻瓜式操作。具體代碼如下:

public ZZOpenScfBaseResult<String> reportCount(ReportCountRequest request) {
        boolean valid = checkAndProcessReportRequest(request);
        if(!valid){
            return ZZOpenScfBaseResult.buildErr(-1,"參數不合法");
        }

        //執行插入、更新總數的邏輯
        boolean locked = redissionLockHelper.tryLockBizCountTotal(request.getEntityId(), request.getBizType(), () -> {
            heroBizCountTotalManager.saveOrUpdate(request.getEntityId(), request.getBizType(), request.getCount());
        });
        if(!locked){
            log.error("lock failed,request:{}", request);
            WxWarnTemplateUtil.warnOutService("計數上報-獲取鎖異常");
            return ZZOpenScfBaseResult.buildErr(-1,"獲取鎖失敗");
        }

        //發送消息
        try {
            bizCountRecordProducer.sendBizCountRecordMsg(buildRecordMsg(request));
        }catch (Exception e){
            WxWarnTemplateUtil.warnOutService("計數上報-發送消息異常");
            log.error("send report msg error, request:{}", request, e);
        }
        //同步總量至緩存,不影響最終一致性,且緩存有有效期,所以不阻塞流程
        try {
            syncTotal2Cache(request.getBizType(), request.getEntityId());
        }catch (Exception e){
            log.error("sync total from db error, request:{}", request, e);
            WxWarnTemplateUtil.warnOutService("計數上報-同步數據至緩存異常");
        }
        return ZZOpenScfBaseResult.buildSucc("");
    }

不得不說的技術設計細節:以空間換時間

從以上代碼中可以看出,我們在整個存儲的過程中是發送了一條MQ消息,還記得我們之前提過,我們是有時間段維度的數據統計的,這個消息就是幫助我們縮短時間段查詢響應時間的關鍵,是真正實現了我們以空間換時間的地方。具體代碼邏輯如下:

public boolean bizCountRecord(String msgId, BizCountRecordMsg body) {
        log.info("bizCountRecord msgId={} body={}", msgId, GsonUtil.toJson(body));
        AtomicBoolean rst = new AtomicBoolean();
        boolean locked = redissionLockHelper.tryLockBizCountTotal(body.getEntityId(), body.getBizType(), () -> {
            HeroBizCountDate heroBizCountDate = heroBizCountDateManager.get(body.getEntityId(), body.getBizType().getCode(), body.getTimestamp());
            if(heroBizCountDate == null){
                rst.set(bizCountService.saveDateOpt(body));
            }
            else{
                rst.set(bizCountService.updateDateOpt(heroBizCountDate, body));
            }
        });
        if(!locked){
            log.info("bizCountRecord msgId={} body={} lock failed", msgId, GsonUtil.toJson(body));
            WxWarnTemplateUtil.warnOutService("計數消費-獲取鎖失敗");
            return false;
        }
        return rst.get();
    }

從以上代碼可以看出,我們在接受到了消息的同時,又單獨維護了一條以業務類型和實體id為組合key的,以天為維度的數據匯總表。有了這個數據表之后,我們就有了一條天然的時間維度。如果需要查詢N天的數據,就不在需要count上報數據的流水表,可以直接通過當前的數據表,以天的問題來進行查詢。如果同一個業務類型和實體id,每天有1000的數據上報,在流水表中我們需要查詢3000條數據,而在這個以天為維度的匯總表中,我們只需要查詢3條數據。這個比例會隨著上報計數數量級的增加,越來越大,讓我們的設計方案優勢變得更加突出。

5.2.2 計數領域的讀取流程

  • 非時間段取數的讀取流程:整體邏輯比較簡潔,就是先查緩存,緩存不存在就查詢DB再寫入緩存即可。圖片
  • 有時間段取數的讀取流程:代碼如下圖所有,我們會先判斷一下,這個時間段內是否有一個完成的自然日,如果沒有的話,直接查詢相關的流水表讀取數量。如果存在,先將時間段里面的自然日從我們按照天維度統計的匯總表里面讀取出來,然后其他的數據在從流水表中獲取,減少需要查詢的數量。
public Map<Long, Long> countTimeBetweenInternal(List<Long> entityIds, BizCountType bizType, Date start, Date end) {
        Map<Long, Long> totalMap = Maps.newHashMapWithExpectedSize(entityIds.size());
        if(!BizCommonDateUtils.containsWholeDays(start, end)){
            return heroBizCountRecordManager.computeRestTime(entityIds, bizType, start, end, Maps.newHashMap());
        }else{
            Map<Long, BizCountDateRange> dateRangeMap = heroBizCountDateManager.getDateRange(entityIds, bizType, start, end);
            Map<Long,Long> dateCountMap = heroBizCountDateManager.countDateBetween(entityIds, bizType, start, end);
            Map<Long,Long> restCountMap= heroBizCountRecordManager.computeRestTime(entityIds, bizType, start, end,dateRangeMap);
            entityIds.forEach(entityId -> {
                Long dateCount = dateCountMap.get(entityId);
                Long restCount = restCountMap.get(entityId);
                if(dateCount != null && restCount != null){
                    totalMap.put(entityId, dateCount + restCount);
                }else if(dateCount != null){
                    totalMap.put(entityId, dateCount);
                }else if(restCount != null){
                    totalMap.put(entityId, restCount);
                }
            });
        }
        return totalMap;
    }

6 總結與規劃

計數系統外置的架構設計也是業內比較通用的設計方案。計數系統外置的架構設計和傳統的計數系統內置的架構設計相比,它能夠顯著降低各業務在復雜計數場景下的維護成本,增強代碼功能的復用性與通用性,提高迭代效率并提升系統穩定性。獨立出來后,一旦出現異常,業務可在短時間內進行降級處理,進而減小對核心業務的影響范圍。此外,針對時間段查詢,采用以空間換時間的設計方式,能夠減少數據的查詢數量,從而提升查詢性能,縮短查詢時間。當然,我們本次受限于開發時間,也有一些不足之處:

1.時間范圍的查詢直接是DB查詢。目前的時間段查詢還是通過count表直接進行的查詢,不過目前時間段查詢數據統計需要用到的地方不多,暫時不會有性能方面的影響,后續可以通過持續迭代來進行改進。

2.沒有根據業務的使用場景來進行劃分。統計數據的使用也有讀多寫少的場景,使用緩存來保存讀多寫少的計數,其實一致性要求不高的計數,也可以先用緩存保存,然后定期刷到數據庫中,以降低數據庫的讀寫壓力。

責任編輯:龐桂玉 來源: 轉轉技術
相關推薦

2021-04-21 18:57:16

二進制存儲空間

2022-04-21 07:51:51

場景JavaSQL

2020-03-26 12:38:15

代碼節點數據

2022-08-12 22:53:32

HadoopHDFS分布式

2025-09-30 02:11:00

2022-11-27 17:39:06

大數據集群性能

2024-10-29 08:21:05

2014-04-01 09:52:46

MySQL

2025-01-10 11:42:13

2013-09-26 14:11:23

SQL性能優化

2011-04-18 11:27:49

空間時間數據庫設計

2017-05-11 11:30:43

MySQL查詢速度

2011-07-01 10:11:39

2024-07-17 08:25:44

2014-03-26 10:00:06

RailsRails性能

2014-11-18 11:45:42

賽靈思

2011-08-16 09:05:21

SQL Server數測試索引空間換時間

2023-10-20 08:12:00

JDK21線程池配置

2025-05-27 01:55:00

TypeScript開發者項目

2020-07-21 15:40:55

NginxJava服務器
點贊
收藏

51CTO技術棧公眾號

91国内在线| 日韩大片免费观看视频播放| 国产亚洲视频在线观看| www.黄色网址.com| 在线免费观看麻豆| 亚洲wwwww| 美女一区二区三区| 欧美日韩国产综合新一区 | 欧美日韩三级一区二区| 国产精品中文久久久久久久| 国产大学生视频| 午夜免费福利在线观看| 亚洲另类视频| 欧美不卡一区二区三区四区| 国产精品波多野结衣| 337p粉嫩色噜噜噜大肥臀| 2023国产精华国产精品| 亚洲欧洲日产国码二区| 国产精品久久久久久超碰| 国内外成人免费视频| 国产成人无码aa精品一区| 国产麻豆一区| 国产精品麻豆99久久久久久| 国产精品第二页| 欧美日韩精品亚洲精品| 国产剧情在线观看一区| 91国模大尺度私拍在线视频| 免费av在线一区二区| 欧美国产成人精品一区二区三区| 日本三级久久| 欧美午夜无遮挡| 欧美日韩一区二区三区在线观看免| 日韩高清精品免费观看| 青青草久久爱| 欧美一区2区视频在线观看| www.69av| 五月婷婷免费视频| 免费亚洲视频| 中文字幕欧美在线| 婷婷中文字幕在线观看| 污视频免费在线观看| 国产蜜臀av在线一区二区三区| 国产精品丝袜白浆摸在线| 91精品国产乱码在线观看| 九九在线精品| 7777精品久久久大香线蕉| 加勒比海盗1在线观看免费国语版| 国产在线视频福利| 激情综合五月天| 精品少妇一区二区30p| 中文字幕第3页| 天天综合av| 国产欧美日韩在线视频| 精品国产乱码久久久久久蜜柚| www.国产色| 日韩av在线播放网址| 欧美卡1卡2卡| 成人精品视频在线播放| 九色在线视频蝌蚪| 91视频免费播放| 国产精品一区二区久久久久| 视频一区二区三区四区五区| 99亚洲一区二区| 色悠悠久久久久| 亚洲区 欧美区| 成人做爰视频www网站小优视频| 国产精品久线观看视频| 亚洲天堂电影网| 日本高清视频在线| 蜜臂av日日欢夜夜爽一区| 国产精品成av人在线视午夜片| 亚洲欧美另类在线视频| 欧美激情1区2区| 亚洲区中文字幕| 亚洲熟女乱综合一区二区| 大胆国模一区二区三区| 欧美日韩在线视频观看| 日韩精品视频久久| aaa大片在线观看| 亚洲精品中文字幕乱码三区| 欧洲精品码一区二区三区免费看| 国产精品-色哟哟| 国产免费成人| 欧美激情精品久久久久久久变态| 精品亚洲aⅴ无码一区二区三区| 亚洲高清999| 欧美日韩国产精选| 超碰在线资源站| 9999久久久久| 51精品视频一区二区三区| 亚洲国产日韩欧美在线观看| 亚洲精品mv| 欧美午夜精品电影| 久久久一本二本三本| bt在线麻豆视频| 国产精品久久久久久久久快鸭| 美女一区视频| 亚洲xxxxxx| 亚洲妇熟xx妇色黄| 欧美在线观看视频免费| 久草资源在线观看| 国产精品国产成人国产三级 | 亚洲v日本v欧美v久久精品| 日本在线观看一区二区| 日韩一区二区三区在线观看视频| 91视频.com| 一区二区三区国产福利| а√天堂中文资源在线bt| 亚洲精品中文在线影院| 免费毛片小视频| 日韩一区二区三免费高清在线观看| 91福利国产精品| 亚洲精品无码久久久久久久| 日韩一级特黄| 日韩精品免费在线| 亚洲成人生活片| 亚洲国产一成人久久精品| 日日摸夜夜添一区| 日韩激情在线播放| 激情偷乱视频一区二区三区| 免费影院在线观看一区| 91极品在线| 欧美视频第二页| 日韩 中文字幕| 啪啪国产精品| 久久精品久久精品亚洲人| 欧美一级特黄高清视频| 亚洲国产一区二区在线观看| 欧美在线视频a| 国产寡妇亲子伦一区二区三区四区| 久久99精品一区二区三区三区| 成人国产在线视频| 国产丝袜视频在线观看| 国产99久久久国产精品潘金网站| 成人免费视频视频在| 色网站免费观看| 久久伊99综合婷婷久久伊| 日韩激情久久| 国产高清中文字幕在线| 日韩一级片网址| 国产一级二级视频| 国产毛片一区二区三区| 97精品国产97久久久久久| 青青国产在线观看| 成人激情免费网站| 欧美在线视频二区| 涩涩涩在线视频| 欧美色图12p| 亚洲第一成人网站| 新67194成人永久网站| 国产久一道中文一区| 午夜视频在线免费播放| 一区二区在线观看视频| 1024精品视频| 日韩欧美黄色| 日韩有码片在线观看| 久久免费播放视频| 青青草97国产精品免费观看无弹窗版| 91色琪琪电影亚洲精品久久| 神马午夜精品95| 婷婷久久综合九色综合绿巨人| 成人性生生活性生交12| 日韩中文在线| 久久99视频免费| 日本国产在线观看| 欧美日韩亚洲视频| 精品人妻互换一区二区三区| 石原莉奈在线亚洲三区| 亚洲一区二区三区香蕉| 欧美精品久久久久久久久久丰满| 综合久久久久久久| 三级性生活视频| 亚洲香蕉视频| 欧美大荫蒂xxx| 精品欧美在线观看| 国产日韩欧美a| 无码人妻少妇伦在线电影| 91综合精品国产丝袜长腿久久| 久久久久亚洲精品| 国产一区二区三区中文字幕| 久久婷婷久久一区二区三区| 欧美 日韩 国产一区| 区一区二视频| 日本一区二区三区在线播放| 亚洲风情第一页| 国产精品久久久久久亚洲毛片| 久久99爱视频| 欧美国产另类| 精品一区二区三区视频日产| 超碰一区二区| 亚洲第一中文字幕| 国产一区二区播放| 成人av电影在线网| 天堂社区在线视频| 欧美日韩99| 成人在线中文字幕| 国产亚av手机在线观看| 日韩亚洲欧美中文三级| 国产乡下妇女做爰视频| 欧美韩国日本一区| 国产伦理在线观看| 国产精品久久久久无码av| 国产精品激情av电影在线观看| 久操视频在线播放| 亚洲男人av在线| 久久黄色精品视频| 1区2区3区国产精品| 在线免费播放av| 韩国毛片一区二区三区| 国产中文字幕视频在线观看| 91一区二区三区四区| 国产精品九九久久久久久久| 2024短剧网剧在线观看| 亚洲色图校园春色| 懂色av蜜臀av粉嫩av分享吧| 一区二区视频免费在线观看| 精品国产无码在线观看| 国产ts人妖一区二区| 香港日本韩国三级网站| 日韩欧美网站| 久久av一区二区| 中文字幕在线官网| 欧美成人午夜视频| 国产 欧美 自拍| 欧美日韩视频专区在线播放| 国产一级视频在线观看| 成人午夜私人影院| 国产69精品久久久久999小说| 九九热hot精品视频在线播放| 国模精品系列视频| 黄色网址在线免费播放| 影音先锋日韩有码| 亚洲图片欧美在线| 亚洲另类在线一区| 阿v天堂2014| 国产麻豆午夜三级精品| 欧美午夜小视频| 综合久久久久| 国产精品毛片va一区二区三区| 欧美性www| 国产精品久久久久久婷婷天堂| 黄色片网站在线观看| 中文字幕欧美专区| 成人免费在线观看| 日韩丝袜情趣美女图片| 国产又粗又猛又爽又黄的| 欧美日韩成人在线一区| 中文字幕av在线免费观看| 亚洲男人的天堂av| 国产91在线播放九色| 国产91丝袜在线播放| 日日夜夜精品视频免费观看| 狠狠色丁香久久婷婷综合丁香| 美女网站视频黄色| 青青草国产精品97视觉盛宴| 亚洲最大综合网| 久久精品国产精品青草| 东北少妇不带套对白| 欧美日韩少妇| 男人日女人逼逼| 亚洲免费网址| 国产一区二区在线免费播放| 久久精品国产77777蜜臀| 中文字幕中文在线| 国产欧美丝祙| 国产肥臀一区二区福利视频| 久久精品午夜| 黄色激情在线视频| 99国产精品久久久久久久成人热 | 欧美日韩情趣电影| 91美女精品网站| 欧美成人猛片aaaaaaa| 天堂在线观看视频| 亚洲欧美国产一区二区三区| 二区三区在线播放| 亚洲成色www8888| 四虎永久在线精品免费网址| 亚洲欧美国产另类| jizz在线观看视频| 欧美成人剧情片在线观看| av第一福利在线导航| 久热精品视频在线观看| www日韩tube| 久久久999国产| ****av在线网毛片| 国产精品久久久久久久久久久久| 国产精品一区免费在线| 精品国产一二| 欧美3p在线观看| 亚洲中文字幕无码av永久| 人人爽香蕉精品| 深夜视频在线观看| 国产亚洲美州欧州综合国| 国语对白在线播放| 欧美体内谢she精2性欧美| 国产精品视频无码| 精品无人区乱码1区2区3区在线| 亚洲欧美高清视频| 亚洲欧美国产日韩中文字幕| 国产成人在线视频免费观看| 欧美亚洲一级片| 亚洲美女炮图| 成人美女av在线直播| 欧美电影免费网站| 经典三级在线视频| 奇米影视7777精品一区二区| 成人在线观看一区二区| 成人午夜在线播放| 91视频免费在观看| 精品电影在线观看| 精品国产九九九| 伊人伊人伊人久久| 免费一二一二在线视频| 亚洲va欧美va国产综合久久| 国产欧美日韩一区二区三区四区| 欧美 亚洲 视频| av大片在线| 国产精品中文字幕在线观看| 麻豆成人入口| 国产乱码精品一区二区三区卡| 视频在线不卡免费观看| 精品一区日韩成人| 九九亚洲视频| 国产黄视频在线| 国产精品中文有码| 国产美女网站视频| 国产最新精品免费| 国产男女猛烈无遮挡a片漫画| 日韩国产精品久久久久久亚洲| 免费看成人片| 香蕉人人精品| 欧美性视频网站| 国产区美女在线| 久久久午夜视频| 99久久夜色精品国产亚洲| 久久久av毛片精品| 免费在线观看a视频| 精品国产精品自拍| 日本xxxx人| 欧美激情一区二区三区久久久| 性欧美又大又长又硬| 成人激情av| 久久99国内| 欧美日韩亚洲一| 久久综合色一综合色88| 久久精品一二区| 亚洲精品国产品国语在线| 国产高清自拍视频在线观看| 精品国产一区二区三区在线观看 | 国产精品美女www爽爽爽视频| 欧美自拍视频| 青青在线免费视频| 国产精品香蕉一区二区三区| 国产精品三区在线观看| 欧美一区二区大片| 羞羞污视频在线观看| 中文字幕成人av| 久久国产精品网| 激情久久中文字幕| 91午夜在线观看| 大白屁股一区二区视频| 日韩手机在线观看| 日韩精品高清在线观看| 电影网一区二区| 色综合电影网| 亚洲婷婷在线| 中国黄色片免费看| 中文字幕制服丝袜成人av| 91theporn国产在线观看| 久久国产加勒比精品无码| ccyy激情综合| 欧美 日韩精品| 国产福利不卡视频| 精品人体无码一区二区三区| 性做久久久久久| 欧美日韩国产综合视频| 国产精品久久视频| 国产大片一区| 亚洲午夜久久久久久久久| 黑人巨大精品欧美一区二区三区| 精品视频一二三| 国产欧美精品在线| 欧美私人啪啪vps| 国产麻豆天美果冻无码视频| 欧美亚洲动漫制服丝袜| 二区三区四区高清视频在线观看| 国产精品久久一区二区三区| 性高湖久久久久久久久| 综合 欧美 亚洲日本| 日韩欧美在线影院| 正在播放日韩精品| 一区二区在线中文字幕电影视频 | 久久亚洲捆绑美女| 成人午夜精品视频| 精品中文视频在线| 日本欧美在线| 国产深夜男女无套内射| 国产iv一区二区三区| 国产伦精品一区二区三区视频网站| 中文字幕久精品免费视频|