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

百萬數據Excel導出功能如何實現?

數據庫 MySQL
做一個MySQL百萬數據級別的excel導出功能,如果走接口同步導出,該接口肯定會非常容易超時。因此,我們在做系統設計的時候,第一選擇應該是接口走異步處理。

前言

最近我做過一個MySQL百萬級別?數據的excel導出功能,已經正常上線使用了。

這個功能挺有意思的,里面需要注意的細節還真不少,現在拿出來跟大家分享一下,希望對你會有所幫助。

原始需求:用戶在UI界面?上點擊全部導出按鈕,就能導出所有商品數據。

咋一看,這個需求挺簡單的。

但如果我告訴你,導出的記錄條數,可能有一百多萬,甚至兩百萬呢?

圖片

這時你可能會倒吸一口氣。

因為你可能會面臨如下問題:

  1. 如果同步導數據,接口很容易超時。
  2. 如果把所有數據一次性裝載到內存,很容易引起OOM。
  3. 數據量太大sql語句必定很慢。
  4. 相同商品編號的數據要放到一起。
  5. 如果走異步,如何通知用戶導出結果?
  6. 如果excel文件太大,目標用戶打不開怎么辦?

我們要如何才能解決這些問題,實現一個百萬級別的excel數據快速導出功能呢?

1、異步處理

做一個MySQL百萬數據級別的excel導出功能,如果走接口同步導出,該接口肯定會非常容易超時。

因此,我們在做系統設計?的時候,第一選擇應該是接口走異步處理。

說起異步處理,其實有很多種,比如:使用開啟一個線程?,或者使用線程池?,或者使用job?,或者使用mq等。

為了防止服務重啟時數據的丟失問題,我們大多數情況下,會使用job?或者mq來實現異步功能。

(1)使用job

如果使用job的話,需要增加一張執行任務表,記錄每次的導出任務。

用戶點擊全部導出按鈕,會調用一個后端接口,該接口會向表中寫入一條記錄,該記錄的狀態為:待執行。

有個job,每隔一段時間(比如:5分鐘),掃描一次執行任務表,查出所有狀態是待執行的記錄。

然后遍歷這些記錄,挨個執行。

需要注意的是:如果用job的話,要避免重復執行的情況。比如job每隔5分鐘執行一次,但如果數據導出的功能所花費的時間超過了5分鐘,在一個job周期內執行不完,就會被下一個job執行周期執行。

所以使用job時可能會出現重復執行的情況。

為了防止job重復執行的情況,該執行任務需要增加一個執行中的狀態。

具體的狀態變化如下:

  1. 執行任務被剛記錄到執行任務表,是待執行狀態。
  2. 當job第一次執行該執行任務時,該記錄再數據庫中的狀態改為:執行中。
  3. 當job跑完了,該記錄的狀態變成:完成?或失敗。

這樣導出數據的功能,在第一個job周期內執行不完,在第二次job執行時,查詢待處理?狀態,并不會查詢出執行中狀態的數據,也就是說不會重復執行。

此外,使用job還有一個硬傷即:它不是立馬執行的,有一定的延遲。

如果對時間不太敏感的業務場景,可以考慮使用該方案。

(2)使用mq

用戶點擊全部導出按鈕,會調用一個后端接口,該接口會向mq服務端?,發送一條mq消息。

有個專門的mq消費者,消費該消息,然后就可以實現excel的數據導出了。

相較于job方案,使用mq方案的話,實時性更好一些。

對于mq消費者處理失敗的情況,可以增加補償機制?,自動發起重試。

RocketMQ?自帶了失敗重試功能?,如果失敗次數超過了一定的閥值?,則會將該消息自動放入死信隊列。

2、使用easyexcel

我們知道在Java?中解析和生成Excel?,比較有名的框架有Apache POI和jxl。

但它們都存在一個嚴重的問題就是:非常耗內存?,POI有一套SAX模式的API可以一定程度的解決一些內存溢出?的問題,但POI還是有一些缺陷,比如07版Excel解壓縮以及解壓后存儲都是在內存中完成的,內存消耗依然很大。

百萬級別的excel數據導出功能,如果使用傳統的Apache POI框架去處理,可能會消耗很大的內存,容易引發OOM問題。

而easyexcel重寫了POI對07版Excel的解析,之前一個3M的excel用POI sax解析,需要100M左右內存,如果改用easyexcel可以降低到幾M,并且再大的Excel也不會出現內存溢出;03版依賴POI的sax模式,在上層做了模型轉換的封裝,讓使用者更加簡單方便。

需要在maven的pom.xml文件中引入easyexcel的jar包:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.2</version>
</dependency>

之后,使用起來非常方便。

讀excel數據非常方便:

@Test
public void simpleRead() {
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
// 這里 需要指定讀用哪個class去讀,然后讀取第一個sheet 文件流會自動關閉
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}

寫excel數據也非常方便:

@Test
public void simpleWrite() {
String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx";
// 這里 需要指定寫用哪個class去讀,然后寫到第一個sheet,名字為模板 然后文件流會自動關閉
// 如果這里想使用03 則 傳入excelType參數即可
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
}

easyexcel能大大減少占用內存的主要原因是:在解析Excel時沒有將文件數據一次性全部加載到內存中,而是從磁盤上一行行讀取數據,逐個解析。

3、分頁查詢

百萬級別的數據,從數據庫一次性查詢出來,是一件非常耗時的工作。

即使我們可以從數據庫中一次性查詢出所有數據,沒出現連接超時問題,這么多的數據全部加載到應用服務的內存中,也有可能會導致應用服務出現OOM問題。

因此,我們從數據庫中查詢數據時,有必要使用分頁查詢。比如:每頁5000條記錄,分為200頁查詢。

public Page<User> searchUser(SearchModel searchModel) {
List<User> userList = userMapper.searchUser(searchModel);
Page<User> pageResponse = Page.create(userList, searchModel);
pageResponse.setTotal(userMapper.searchUserCount(searchModel));
return pageResponse;
}

每頁大小pageSize?和頁碼pageNo,是SearchModel類中的成員變量,在創建searchModel對象時,可以設置設置這兩個參數。

然后在Mybatis?的sql文件中,通過limit語句實現分頁功能:

limit #{pageStart}, #{pageSize}

其中的pagetStart參數,是通過pageNo和pageSize動態計算出來的,比如:

pageStart = (pageNo - 1) * pageSize;

4、多個sheet

我們知道,excel對一個sheet存放的最大數據量,是有做限制的,一個sheet最多可以保存1048576行數據。否則在保存數據時會直接報錯:

invalid row number (1048576) outside allowable range (0..1048575)

如果你想導出一百萬以上的數據,excel的一個sheet肯定是存放不下的。

圖片

因此我們需要把數據保存到多個sheet中。

圖片

5、計算limit的起始位置

我之前說過,我們一般是通過limit語句來實現分頁查詢功能的:

limit #{pageStart}, #{pageSize}

其中的pagetStart參數,是通過pageNo和pageSize動態計算出來的,比如:

pageStart = (pageNo - 1) * pageSize;

如果只有一個sheet可以這么玩,但如果有多個sheet就會有問題。因此,我們需要重新計算limit的起始位置。

例如:

ExcelWriter excelWriter = EasyExcelFactory.write(out).build();
int totalPage = searchUserTotalPage(searchModel);

if(totalPage > 0) {
Page<User> page = Page.create(searchModel);
int sheet = (totalPage % maxSheetCount == 0) ? totalPage / maxSheetCount: (totalPage / maxSheetCount) + 1;
for(int i=0;i<sheet;i++) {
WriterSheet writeSheet = buildSheet(i,"sheet"+i);
int startPageNo = i*(maxSheetCount/pageSize)+1;
int endPageNo = (i+1)*(maxSheetCount/pageSize);
while(page.getPageNo()>=startPageNo && page.getPageNo()<=endPageNo) {
page = searchUser(searchModel);
if(CollectionUtils.isEmpty(page.getList())) {
break;
}

excelWriter.write(page.getList(),writeSheet);
page.setPageNo(page.getPageNo()+1);
}
}
}

這樣就能實現分頁查詢,將數據導出到不同的excel的sheet當中。

6、文件上傳到OSS

由于現在我們導出excel數據的方案改成了異步,所以沒法直接將excel文件,同步返回給用戶。

因此我們需要先將excel文件存放到一個地方,當用戶有需要時,可以訪問到。

這時,我們可以直接將文件上傳到OSS文件服務器上。

通過OSS提供的上傳接口,將excel上傳成功后,會返回文件名稱?和訪問路徑。

我們可以將excel名稱和訪問路徑保存到表?中,這樣的話,后面就可以直接通過瀏覽器?,訪問遠程excel文件了。

而如果將excel文件保存到應用服務器?,可能會占用比較多的磁盤空間。

一般建議將應用服務器和文件服務器?分開,應用服務器需要更多的內存資源?或者CPU資源?,而文件服務器?需要更多的磁盤資源。

7、通過WebSocket推送通知

通過上面的功能已經導出了excel文件,并且上傳到了OSS文件服務器上。

接下來的任務是要本次excel導出結果,成功還是失敗,通知目標用戶。

有種做法是在頁面上提示:正在導出excel數據,請耐心等待。

然后用戶可以主動刷新當前頁面,獲取本地導出excel的結果。

但這種用戶交互功能,不太友好。

還有一種方式是通過webSocket建立長連接,進行實時通知推送。

如果你使用了SpringBoot框架,可以直接引入webSocket的相關jar包:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

使用起來挺方便的。

我們可以加一張專門的通知表,記錄通過webSocket推送的通知的標題、用戶、附件地址、閱讀狀態、類型等信息。

能更好的追溯通知記錄。

webSocket給客戶端推送一個通知之后,用戶的右上角的收件箱上,實時出現了一個小窗口,提示本次導出excel功能是成功還是失敗,并且有文件下載鏈接。

當前通知的閱讀狀態是未讀。

用戶點擊該窗口,可以看到通知的詳細內容,然后通知狀態變成已讀。

8、總條數可配置

我們在做導百萬級數據這個需求時,是給用戶用的,也有可能是給運營同學用的。

其實我們應該站在實際用戶的角度出發,去思考一下,這個需求是否合理。

用戶拿到這個百萬級別的excel文件,到底有什么用途,在他們的電腦上能否打開該excel文件,電腦是否會出現太大的卡頓了,導致文件使用不了。

如果該功能上線之后,真的發生發生這些情況,那么導出excel也沒有啥意義了。

因此,非常有必要把記錄的總條數?,做成可配置的,可以根據用戶的實際情況調整這個配置。

比如:用戶發現excel中有50萬的數據,可以正常訪問和操作excel,這時候我們可以將總條數調整成500000,把多余的數據截取掉。

其實,在用戶的操作界面,增加更多的查詢條件,用戶通過修改查詢條件,多次導數據,可以實現將所有數據都導出的功能,這樣可能更合理一些。

此外,分頁查詢時,每頁的大小,也建議做成可配置的。

通過總條數和每頁大小,可以動態調整記錄數量和分頁查詢次數,有助于更好滿足用戶的需求。

9、order by商品編號

之前的需求是要將相同商品編號的數據放到一起。

例如:

編號

商品名稱

倉庫名稱

價格

1

筆記本

北京倉

7234

1

筆記本

上海倉

7235

1

筆記本

武漢倉

7236

2

平板電腦

成都倉

7236

2

平板電腦

大連倉

3339

但我們做了分頁查詢的功能,沒法將數據一次性查詢出來,直接在Java內存中分組或者排序。

因此,我們需要考慮在sql語句中使用order by 商品編號,先把數據排好順序,再查詢出數據,這樣就能將相同商品編號,倉庫不同的數據放到一起。

此外,還有一種情況需要考慮一下,通過配置的總記錄數將全部數據做了截取。

但如果最后一個商品編號在最后一頁中沒有查詢完,可能會導致導出的最后一個商品的數據不完整。

因此,我們需要在程序中處理一下,將最后一個商品刪除。

但加了order by關鍵字進行排序之后,如果查詢sql中join了很多張表,可能會導致查詢性能變差。

那么,該怎么辦呢?

總結

最后用兩張圖,總結一下excel異步導數據的流程。

如果是使用mq導數據:

圖片

如果是使用job導數據:

圖片

這兩種方式都可以,可以根據實際情況選擇使用。

我們按照這套方案的開發了代碼,發到了pre環境,原本以為會非常順利,但后面卻還是出現了性能問題。

后來,我們用了兩招輕松解決了性能問題。

責任編輯:姜華 來源: 蘇三說技術
相關推薦

2023-02-25 10:04:21

JavaExcel導出功能

2025-05-12 00:00:00

2020-09-22 09:41:09

前端

2024-08-05 09:51:00

2025-09-10 01:55:00

2024-07-30 15:56:42

2020-12-02 11:56:16

Java注解Excel

2021-10-28 19:36:20

SQLExcel功能

2020-12-30 08:12:17

SQLExcel分列

2020-05-14 14:57:48

MySQLExcel排序

2024-04-09 13:20:00

Excel數據庫數據

2022-02-09 18:28:46

多線程Excel代碼

2025-04-07 03:22:00

Excel服務器oss

2025-03-03 08:00:00

SpringBootEasyExcel數據導出

2024-12-26 09:15:28

2010-06-09 10:09:39

MySQL 數據庫導入

2010-12-31 15:22:26

郵箱數據

2021-03-26 07:09:15

Java技術pdfExcel

2025-02-12 07:27:52

MySQL8分頁查詢excel

2025-05-09 10:01:06

EasyExcelMySQLMySQL8
點贊
收藏

51CTO技術棧公眾號

亚洲一区欧美| 一级毛片久久久| 国产精品18久久久久久vr| 欧美激情精品久久久久| 国产精品久久久免费观看| 国产日韩另类视频一区| 亚洲日本乱码在线观看| 精品国产综合久久| 中文无码av一区二区三区| 欧美三级第一页| 亚洲欧洲第一视频| 在线观看视频在线观看| 三妻四妾完整版在线观看电视剧| 欧美国产综合一区二区| 成人做爰66片免费看网站| 中文字幕一区二区三区四区欧美| 欧美福利专区| 亚洲天堂av在线免费| 国产无套精品一区二区三区| 91精品xxx在线观看| 一区二区三区久久| 手机在线观看国产精品| 全部免费毛片在线播放一个| 精品影院一区二区久久久| 91av在线影院| 欧美交换国产一区内射| 欧美日韩激情| 亚洲男人av电影| 日本成人在线免费| 高清在线一区| 色老头久久综合| 五月丁香综合缴情六月小说| 黄色在线免费网站| 久久久久久久电影| 国产精品高清一区二区三区| 国产精品-色哟哟| 日韩高清不卡在线| 日本人成精品视频在线| 国产欧美日韩另类| 黄色工厂这里只有精品| 久色乳综合思思在线视频| 东京热无码av男人的天堂| 综合亚洲自拍| 日韩毛片中文字幕| 艳妇乳肉亭妇荡乳av| 综合激情网...| 日韩午夜电影av| 国产农村妇女精品久久| 电影一区二区三区久久免费观看| 欧美性视频一区二区三区| 日本精品一区二区三区四区| 国产盗摄——sm在线视频| 亚洲成人动漫av| 欧美国产视频一区| 天堂8中文在线| 亚洲精品视频在线| 免费cad大片在线观看| 先锋成人av| 一二三四社区欧美黄| 欧美 日韩 国产精品| 在线观看小视频| 亚洲一区二区黄色| 久久综合久久久久| 超碰在线视屏| 精品国产a一区二区三区v免费| 蜜臂av日日欢夜夜爽一区| 国产成人综合亚洲| 中文字幕精品无码亚| 久久国产视频网| 91欧美激情另类亚洲| 国产sm主人调教女m视频| 国产激情一区二区三区四区| 国产精品一区二区免费看| 午夜成人鲁丝片午夜精品| 91片在线免费观看| 先锋影音网一区| 国产视频在线播放| 亚洲综合激情网| 男人揉女人奶房视频60分| 欧美精品资源| 91精品国产一区二区三区蜜臀| 无码人妻丰满熟妇啪啪网站| 欧美美女在线直播| 最近2019免费中文字幕视频三| 成年人二级毛片| 亚洲激情网址| 国产精品高潮呻吟久久av无限| 一级黄色片免费看| 成人小视频免费在线观看| 欧美1o一11sex性hdhd| 尤物视频在线免费观看| 亚洲影院理伦片| 毛片av免费在线观看| 99久久999| 日韩黄色av网站| 开心激情五月网| 国产精品久久777777毛茸茸| 国产精品天天狠天天看| 欧美人体一区二区三区| 欧洲日韩一区二区三区| 欧美视频亚洲图片| 日本欧美高清| 久久成人国产精品| 天天干天天操天天爱| 国产一区二区伦理| 久久久婷婷一区二区三区不卡| 欧美激情午夜| 日韩欧美亚洲综合| 一二三av在线| 成人久久电影| 欧美在线视频一区| 国产不卡av在线播放| 中文字幕不卡在线播放| 亚洲自偷自拍熟女另类| 久久国产精品美女| 夜夜嗨av色综合久久久综合网| 久久久无码精品亚洲国产| 免费久久99精品国产| 久久99蜜桃综合影院免费观看| 欧美日韩欧美| 欧美中文字幕一区| 欧美熟妇精品黑人巨大一二三区| 亚洲综合专区| 国产主播在线一区| 国产资源在线观看| 午夜成人免费视频| 古装做爰无遮挡三级聊斋艳谭| 青草国产精品| 国产精品久久久久久久久久99| 秋霞网一区二区| 亚洲一区二区三区视频在线播放 | 欧美久久高跟鞋激| 一色道久久88加勒比一| 91久久综合| yy111111少妇影院日韩夜片| 精品麻豆一区二区三区| 欧美三级资源在线| 性欧美一区二区| 久久aⅴ国产紧身牛仔裤| 国产伦精品一区二区三区视频黑人| 成年网站在线| 欧洲视频一区二区| 日本成人免费视频| 美女尤物久久精品| 欧美精品二区三区四区免费看视频 | **国产精品| 中文字幕在线国产精品| 成人免费视频国产免费| 久久青草欧美一区二区三区| 成人毛片视频网站| 红杏成人性视频免费看| 91精品国产乱码久久久久久蜜臀 | 亚洲网址你懂得| 男人天堂2024| 久久精品男人天堂av| 久久久精品在线视频| 免费成人结看片| 国产盗摄xxxx视频xxx69| 久草视频视频在线播放| 91久久精品网| 青青草华人在线视频| 另类小说视频一区二区| 国内不卡的二区三区中文字幕| http;//www.99re视频| 男女在线观看视频| 亚洲国产成人久久综合| wwwxxx亚洲| 久久久久久久电影| 性欧美videossex精品| 欧美电影一区| 99九九电视剧免费观看| 欧美激情网站| 亚洲欧洲免费视频| 亚洲视频在线观看一区二区| 国产精品的网站| 精品国产乱码久久久久久1区二区| 亚洲午夜精品一区二区国产| 国产精品三区www17con| 黄页在线观看免费| 亚洲欧美制服综合另类| 亚洲永久精品视频| 一区二区三区蜜桃| 95视频在线观看| 狂野欧美性猛交xxxx巴西| 中国成人在线视频| 538任你躁精品视频网免费| 97国产suv精品一区二区62| 欧美美女搞黄| 欧美精品777| 97超碰人人干| 亚洲国产精华液网站w| 日本一二三四区视频| 99热免费精品在线观看| 亚洲开发第一视频在线播放| 天堂久久av| 国产高清视频一区三区| 欧洲在线视频| 亚洲色图日韩av| 亚洲av色香蕉一区二区三区| 一本在线高清不卡dvd| 久久久久久久久久97| 99精品视频一区二区三区| 一级片视频免费观看| 国自产拍偷拍福利精品免费一| 欧洲av一区| h视频久久久| 国产精品亚洲精品| 国产三级伦理在线| 色妞欧美日韩在线| 日本在线视频1区| 欧美一级理论片| 波多野结衣大片| 午夜伊人狠狠久久| 中国一级片在线观看| 久久青草国产手机看片福利盒子 | 综合网中文字幕| 三级小视频在线观看| 欧美日韩一本到| 无码人妻av免费一区二区三区 | 网红女主播少妇精品视频| 成人欧美一区二区三区在线| 亚洲风情在线资源| 久久成人亚洲精品| 国产免费av在线| 日韩av在线电影网| 亚洲国产精品久久久久久久| 欧美肥妇毛茸茸| 精品黑人一区二区三区| 都市激情亚洲色图| 久久久久久久久久99| 亚洲欧美日韩在线| 国产传媒视频在线| 欧美国产精品一区二区三区| 性色av蜜臀av色欲av| 成人综合婷婷国产精品久久蜜臀 | 国产欧美精品国产国产专区 | 韩国av电影在线观看| 3d成人h动漫网站入口| 国产精品无码粉嫩小泬| 91精品福利在线| 成人毛片在线播放| 欧美日韩亚洲视频| 男人天堂中文字幕| 亚洲成人午夜电影| 久久精品久久精品久久| 亚洲已满18点击进入久久| 国产高清在线免费观看| 亚洲三级在线免费| 午夜国产福利一区二区| 亚洲理论在线观看| 麻豆天美蜜桃91| 亚洲精品视频一区| 久久国产精品波多野结衣| 亚洲另类春色国产| 久久久一区二区三区四区| 亚洲午夜免费电影| 日本网站在线免费观看| 富二代精品短视频| 区一区二在线观看| 欧美午夜精品理论片a级按摩| 欧美韩国日本在线| 麻豆网站在线看| 色噜噜国产精品视频一区二区 | 欧美大肥婆大肥bbbbb| 国产黄色在线网站| 久久久久免费精品国产| 美女av在线免费看| 欧美一级淫片播放口| 欧美日韩大片| 国产美女搞久久| 免费观看亚洲天堂| 精品一区二区日本| 国产一区二区三区四区五区 | 黄瓜视频污在线观看| 久久久不卡网国产精品一区| 手机看片日韩av| 亚洲免费观看高清完整版在线观看| 青青草在线观看视频| 欧美日韩国产精品一区二区不卡中文 | 欧美日韩在线二区| 色婷婷777777仙踪林| 亚洲精品国产日韩| 久久婷婷国产91天堂综合精品| 经典一区二区三区| 怡红院一区二区| 久久精品一区二区三区不卡牛牛| 人人澡人人澡人人看| 岛国av一区二区| 亚洲怡红院av| 日韩电影第一页| 色网站在线看| 97福利一区二区| 97久久精品一区二区三区的观看方式 | 久久精视频免费在线久久完整在线看| 蜜桃传媒在线观看免费进入 | 91丨porny丨在线中文 | 91网站免费视频| 亚洲人午夜精品天堂一二香蕉| 日本一本高清视频| 欧美日韩国产另类一区| 欧美一级淫片免费视频魅影视频| 中文字幕欧美视频在线| а√天堂8资源中文在线| 国产精品久久色| 欧美日韩看看2015永久免费 | 精品粉嫩超白一线天av| h网站在线免费观看| 韩国国内大量揄拍精品视频| 亚洲国产aⅴ精品一区二区三区| 精品产品国产在线不卡| 99精品全国免费观看视频软件| 免费av观看网址| 国产乱妇无码大片在线观看| av电影在线不卡| 亚洲国产精品麻豆| 国产欧美久久久精品免费| 亚洲桃花岛网站| 九九精品调教| 国产一区二中文字幕在线看| 久久av资源| 国产v片免费观看| 国产精品1区2区| 黑人狂躁日本娇小| 欧美亚洲一区三区| 天堂中文在线8| 精品国偷自产在线| 欧美日韩女优| 欧美性xxxx69| 久久av最新网址| www.超碰97| 午夜伊人狠狠久久| 日本激情一区二区三区| 欧美日本精品在线| av日韩一区| 先锋影音男人资源| 久久激情五月激情| 2019男人天堂| 欧美视频中文字幕| 国内av一区二区三区| 国产精品99久久久久久www | 亚洲午夜精品久久久久久性色| 亚洲美女炮图| 久久综合九九| 免费永久网站黄欧美| 一级特黄a大片免费| 婷婷丁香激情综合| 天堂在线中文资源| 欧美亚洲一级片| 希岛爱理av免费一区二区| 国产免费黄色av| 91老司机福利 在线| www亚洲视频| 尤物99国产成人精品视频 | 91精品国产一区二区三区动漫 | 欧美日韩精品在线一区| 黄色三级视频在线| 中文字幕精品—区二区四季| 中文字幕人妻一区二区在线视频 | 综合欧美精品| 国产av第一区| 国产91丝袜在线播放九色| 成人黄色片免费| 日韩高清一区| 色哟哟免费网站| 成人激情免费电影网址| 国产精品第一页在线观看| 日韩av在线一区| 欧洲av一区二区| 日韩第一页在线观看| 国产九色精品成人porny| 免费一级肉体全黄毛片| 精品视频在线播放免| 一呦二呦三呦精品国产| 男女啪啪的视频| 成人爱爱电影网址| 精品久久久久久久久久久久久久久久 | 亚洲国产成人av| 亚洲欧美综合在线观看| 国产精品久久久久免费a∨| 中文字幕人成人乱码| 最近日本中文字幕| 欧美三电影在线| 色av手机在线| 日本不卡二区| 国产伦理精品不卡| 国产污污视频在线观看 | 国产午夜精品久久久久久久久| 欧美一区二区视频在线观看 | 色狠狠一区二区| 国产福利视频在线观看| 国产一区再线| 久久精品国产亚洲aⅴ| 日本三级午夜理伦三级三| 国产亚洲精品久久久久久777| 国产美女视频一区二区| 免费无遮挡无码永久视频| 国产精品久久久久久久久久久免费看 | 99精品视频在线免费观看| 中文字幕免费播放| 孩xxxx性bbbb欧美|