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

聊聊高并發下如何防重?

開發
最近測試給我提了一個bug,說我之前提供的一個批量復制商品的接口,產生了重復的商品數據。追查原因之后發現,這個事情沒想象中簡單,可以說一波多折。

最近測試給我提了一個bug,說我之前提供的一個批量復制商品的接口,產生了重復的商品數據。

追查原因之后發現,這個事情沒想象中簡單,可以說一波多折。

1. 需求

產品有個需求:用戶選擇一些品牌,點擊確定按鈕之后,系統需要基于一份默認品牌的商品數據,復制出一批新的商品。

拿到這個需求時覺得太簡單了,三下五除二就搞定。

我提供了一個復制商品的基礎接口,給商城系統調用。

當時的流程圖如下:

圖片

如果每次復制的商品數量不多,使用同步接口調用的方案問題也不大。

2. 性能優化

但由于每次需要復制的商品數量比較多,可能有幾千。

如果每次都是用同步接口的方式復制商品,可能會有性能問題。

因此,后來我把復制商品的邏輯改成使用mq異步處理。

改造之后的流程圖:圖片復制商品的結果還需要通知商城系統:

圖片

這個方案看起來,挺不錯的。

但后來出現問題了。

3. 出問題了

測試給我們提了一個bug,說我之前提供的一個批量復制商品的接口,產生了重復的商品數據。

經過追查之后發現,商城系統為了性能考慮,也改成異步了。

他們沒有在接口中直接調用基礎系統的復制商品接口,而是在job中調用的。

站在他們的視角流程圖是這樣的:

圖片

用戶調用商城的接口,他們會往請求記錄表中寫入一條數據,然后在另外一個job中,異步調用基礎系統的接口去復制商品。

但實際情況是這樣的:商城系統內部出現了bug,在請求記錄表中,同一條請求產生了重復的數據。這樣導致的結果是,在job中調用基礎系統復制商品接口時,發送了重復的請求。

剛好基礎系統現在是使用RocketMQ異步處理的。由于商城的job一次會取一批數據(比如:20條記錄),在極短的時間內(其實就是在一個for循環中)多次調用接口,可能存在相同的請求參數連續調用復制商品接口情況。于是,出現了并發插入重復數據的問題。

為什么會出現這個問題呢?

4. 多線程消費

RocketMQ的消費者,為了性能考慮,默認是用多線程并發消費的,最大支持64個線程。

例如:

@RocketMQMessageListener(topic = "${com.susan.topic:PRODUCT_TOPIC}",
consumerGroup = "${com.susan.group:PRODUCT_TOPIC_GROUP}")
@Service
public class MessageReceiver implements RocketMQListener<MessageExt> {

@Override
public void onMessage(MessageExt message) {
String message = new String(message.getBody(), StandardCharsets.UTF_8);
doSamething(message);
}
}

也就是說,如果在極短的時間內,連續發送重復的消息,就會被不同的線程消費。

即使在代碼中有這樣的判斷:

Product oldProduct = query(hashCode);
if(oldProduct == null) {
productMapper.insert(product);
}

在插入數據之前,先判斷該數據是否已經存在,只有不存在才會插入。

但由于在并發情況下,不同的線程都判斷商品數據不存在,于是同時進行了插入操作,所以就產生了重復數據。

如下圖所示:

圖片

5. 順序消費

為了解決上述并發消費重復消息的問題,我們從兩方面著手:

  • 商城系統修復產生重復記錄的bug。
  • 基礎系統將消息改成單線程順序消費。

我仔細思考了一下,如果只靠商城系統修復bug,以后很難避免不出現類似的重復商品問題,比如:如果用戶在極短的時間內點擊創建商品按鈕多次,或者商城系統主動發起重試。

所以,基礎系統還需進一步處理。

其實RocketMQ本身是支持順序消費的,需要消息的生產者和消費者一起改。

生產者改為:

rocketMQTemplate.asyncSendOrderly(topic, message, hashKey, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
log.info("sendMessage success");
}

@Override
public void onException(Throwable e) {
log.error("sendMessage failed!");
}
});

重點是要調用rocketMQTemplate對象的asyncSendOrderly方法,發送順序消息。

消費者改為:

@RocketMQMessageListener(topic = "${com.susan.topic:PRODUCT_TOPIC}",
consumeMode = ConsumeMode.ORDERLY,
consumerGroup = "${com.susan.group:PRODUCT_TOPIC_GROUP}")
@Service
public class MessageReceiver implements RocketMQListener<MessageExt> {

@Override
public void onMessage(MessageExt message) {
String message = new String(message.getBody(), StandardCharsets.UTF_8);
doSamething(message);
}
}

接收消息的重點是RocketMQMessageListener注解中的consumeMode參數,要設置成ConsumeMode.ORDERLY,這樣就能順序消費消息了。

修改后關鍵流程圖如下:

圖片

兩邊都修改之后,復制商品這一塊就沒有再出現重復商品的問題了。

But,修完bug之后,我又思考了良久。

復制商品只是創建商品的其中一個入口,如果有其他入口,跟復制商品功能同時創建新商品呢?

不也會出現重復商品問題?

雖說,這種概率非常非常小。

但如果一旦出現重復商品問題,后續涉及到要合并商品的數據,非常麻煩。

經過這一次的教訓,一定要防微杜漸。

不管是用戶,還是自己的內部系統,從不同的入口創建商品,都需要解決重復商品創建問題。

那么,如何解決這個問題呢?

6. 唯一索引

解決重復商品數據問題,最快成本最低最有效的辦法是:給表建唯一索引。

想法是好的,但我們這邊有個規范就是:業務表必須都是邏輯刪除。

而我們都知道,要刪除表的某條記錄的話,如果用delete語句操作的話。

例如:

delete from product where id=123;

這種delete操作是物理刪除,即該記錄被刪除之后,后續通過sql語句基本查不出來。(不過通過其他技術手段可以找回,那是后話了)

還有另外一種是邏輯刪除,主要是通過update語句操作的。

例如:

update product set delete_status=1,edit_time=now(3) 
where id=123;

邏輯刪除需要在表中額外增加一個刪除狀態字段,用于記錄數據是否被刪除。在所有的業務查詢的地方,都需要過濾掉已經刪除的數據。

通過這種方式刪除數據之后,數據任然還在表中,只是從邏輯上過濾了刪除狀態的數據而已。

其實對于這種邏輯刪除的表,是沒法加唯一索引的。

為什么呢?

假設之前給商品表中的name和model加了唯一索引,如果用戶把某條記錄刪除了,delete_status設置成1了。后來,該用戶發現不對,又重新添加了一模一樣的商品。

由于唯一索引的存在,該用戶第二次添加商品會失敗,即使該商品已經被刪除了,也沒法再添加了。

這個問題顯然有點嚴重。

有人可能會說:把name、model和delete_status三個字段同時做成唯一索引不就行了?

答:這樣做確實可以解決用戶邏輯刪除了某個商品,后來又重新添加相同的商品時,添加不了的問題。但如果第二次添加的商品,又被刪除了。該用戶第三次添加相同的商品,不也出現問題了?

由此可見,如果表中有邏輯刪除功能,是不方便創建唯一索引的。

7. 分布式鎖

接下來,你想到的第二種解決數據重復問題的辦法可能是:加分布式鎖。

目前最常用的性能最高的分布式鎖,可能是redis分布式鎖了。

使用redis分布式鎖的偽代碼如下:

try{
String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
if ("OK".equals(result)) {
doSamething();
return true;
}
return false;
} finally {
unlock(lockKey,requestId);
}

不過需要在finally代碼塊中釋放鎖。

其中lockKey是由商品表中的name和model組合而成的,requestId是每次請求的唯一標識,以便于它每次都能正確得釋放鎖。還需要設置一個過期時間expireTime,防止釋放鎖失敗,鎖一直存在,導致后面的請求沒法獲取鎖。

如果只是單個商品,或者少量的商品需要復制添加,則加分布式鎖沒啥問題。

主要流程如下:

圖片

可以在復制添加商品之前,先嘗試加鎖。如果加鎖成功,則在查詢商品是否存在,如果不存在,則添加商品。此外,在該流程中如果加鎖失敗,或者查詢商品時不存在,則直接返回。

加分布式鎖的目的是:保證查詢商品和添加商品的兩個操作是原子性的操作。

但現在的問題是,我們這次需要復制添加的商品數量很多,如果每添加一個商品都要加分布式鎖的話,會非常影響性能。

顯然對于批量接口,加redis分布式鎖,不是一個理想的方案。

8. 統一mq異步處理

前面我們已經聊過,在批量復制商品的接口,我們是通過RocketMQ的順序消息,單線程異步復制添加商品的,可以暫時解決商品重復的問題。

但那只改了一個添加商品的入口,還有其他添加商品的入口。

能不能把添加商品的底層邏輯統一一下,最終都調用同一段代碼。然后通過RocketMQ的順序消息,單線程異步添加商品。

主要流程如下圖所示:圖片這樣確實能夠解決重復商品的問題。

但同時也帶來了另外兩個問題:

  • 現在所有的添加商品功能都改成異步了,之前同步添加商品的接口如何返回數據呢?這就需要修改前端交互,否則會影響用戶體驗。
  • 之前不同的添加商品入口,是多線程添加商品的,現在改成只能由一個線程添加商品,這樣修改的結果導致添加商品的整體效率降低了。

由此,綜合考慮了一下各方面因素,這個方案最終被否定了。

9. insert on duplicate key update

其實,在mysql中存在這樣的語法,即:insert on duplicate key update。

在添加數據時,mysql發現數據不存在,則直接insert。如果發現數據已經存在了,則做update操作。

不過要求表中存在唯一索引或PRIMARY KEY,這樣當這兩個值相同時,才會觸發更新操作,否則是插入。

現在的問題是PRIMARY KEY是商品表的主鍵,是根據雪花算法提前生成的,不可能產生重復的數據。

但由于商品表有邏輯刪除功能,導致唯一索引在商品表中創建不了。

由此,insert on duplicate key update這套方案,暫時也沒法用。

此外,insert on duplicate key update在高并發的情況下,可能會產生死鎖問題,需要特別注意一下。

感興趣的小伙伴,也可以找我私聊。

其實insert on duplicate key update的實戰,我在另一篇文章《??我用kafka兩年踩過的一些非比尋常的坑??》中介紹過的,感興趣的小伙伴,可以看看。

10. insert ignore

在mysql中還存在這樣的語法,即:insert ... ignore。

在insert語句執行的過程中:mysql發現如果數據重復了,就忽略,否則就會插入。

它主要是用來忽略,插入重復數據產生的Duplicate entry 'XXX' for key 'XXXX'異常的。

不過也要求表中存在唯一索引或PRIMARY KEY。

但由于商品表有邏輯刪除功能,導致唯一索引在商品表中創建不了。

由此可見,這個方案也不行。

溫馨的提醒一下,使用insert ... ignore也有可能會導致死鎖。

11. 防重表

之前聊過,因為有邏輯刪除功能,給商品表加唯一索引,行不通。

后面又說了加分布式鎖,或者通過mq單線程異步添加商品,影響創建商品的性能。

那么,如何解決問題呢?

我們能否換一種思路,加一張防重表,在防重表中增加商品表的name和model字段作為唯一索引。

例如:

CREATE TABLE `product_unique` (
`id` bigint(20) NOT NULL COMMENT 'id',
`name` varchar(130) DEFAULT NULL COMMENT '名稱',
`model` varchar(255) NOT NULL COMMENT '規格',
`user_id` bigint(20) unsigned NOT NULL COMMENT '創建用戶id',
`user_name` varchar(30) NOT NULL COMMENT '創建用戶名稱',
`create_date` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '創建時間',
PRIMARY KEY (`id`),
UNIQUE KEY `ux_name_model` (`name`,`model`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品防重表';

其中表中的id可以用商品表的id,表中的name和model就是商品表的name和model,不過在這張防重表中增加了這兩個字段的唯一索引。

視野一下子被打開了。

在添加商品數據之前,先添加防重表。如果添加成功,則說明可以正常添加商品,如果添加失敗,則說明有重復數據。

防重表添加失敗,后續的業務處理,要根據實際業務需求而定。

如果業務上允許添加一批商品時,發現有重復的,直接拋異常,則可以提示用戶:系統檢測到重復的商品,請刷新頁面重試。

例如:

try {
transactionTemplate.execute((status) -> {
productUniqueMapper.batchInsert(productUniqueList);
productMapper.batchInsert(productList);
return Boolean.TRUE;
});
} catch(DuplicateKeyException e) {
throw new BusinessException("系統檢測到重復的商品,請刷新頁面重試");
}

在批量插入數據時,如果出現了重復數據,捕獲DuplicateKeyException異常,轉換成BusinessException這樣運行時的業務異常。

還有一種業務場景,要求即使出現了重復的商品,也不拋異常,讓業務流程也能夠正常走下去。

例如:

try {
transactionTemplate.execute((status) -> {
productUniqueMapper.insert(productUnique);
productMapper.insert(product);
return Boolean.TRUE;
});
} catch(DuplicateKeyException e) {
product = productMapper.query(product);
}

在插入數據時,如果出現了重復數據,則捕獲DuplicateKeyException,在catch代碼塊中再查詢一次商品數據,將數據庫已有的商品直接返回。

如果調用了同步添加商品的接口,這里非常關鍵的一點,是要返回已有數據的id,業務系統做后續操作,要拿這個id操作。

當然在執行execute之前,還是需要先查一下商品數據是否存在,如果已經存在,則直接返回已有數據,如果不存在,才執行execute方法。這一步千萬不能少。

例如:

Product oldProduct = productMapper.query(product);
if(Objects.nonNull(oldProduct)) {
return oldProduct;
}

try {
transactionTemplate.execute((status) -> {
productUniqueMapper.insert(productUnique);
productMapper.insert(product);
return Boolean.TRUE;
});
} catch(DuplicateKeyException e) {
product = productMapper.query(product);
}
return product;

千萬注意:防重表和添加商品的操作必須要在同一個事務中,否則會出問題。

順便說一下,還需要對商品的刪除功能做特殊處理一下,在邏輯刪除商品表的同時,要物理刪除防重表。用商品表id作為查詢條件即可。

說實話,解決重復數據問題的方案挺多的,沒有最好的方案,只有最適合業務場景的,最優的方案。

此外,如果你對重復數據衍生出的冪等性問題感興趣的話,可以看看我的另一篇文章《??高并發下如何保證接口的冪等性???》,里面有非常詳細的介紹。

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

2021-03-28 09:45:05

冪等性接口數據

2013-01-30 10:12:24

NginxNginx優化高并發

2014-08-08 13:30:44

Nginx

2019-02-15 10:11:23

2020-07-15 08:14:12

高并發

2025-02-26 08:20:18

2025-02-20 00:01:00

2024-11-26 07:29:57

高并發線程安全

2024-02-02 11:24:00

I/O高并發場景

2016-11-25 00:38:45

隔離負載均衡系統

2023-02-03 15:16:42

SpringHystrix

2019-10-30 16:54:08

golangredis數據庫

2024-03-13 15:18:00

接口冪等性高并發

2016-11-25 00:45:37

隊列數據

2016-11-28 08:40:17

系統降級服務

2016-11-28 09:00:10

瀏覽器瀏覽器緩存服務端

2024-10-31 09:04:20

Spring高并發

2020-09-23 22:36:27

分布式架構系統

2017-11-27 08:50:29

架構數據存儲

2016-11-28 08:58:43

系統限流
點贊
收藏

51CTO技術棧公眾號

日韩黄色三级在线观看| 人妻精品一区一区三区蜜桃91| 成人影视亚洲图片在线| 91精品在线免费观看| 日韩精品一区二区免费| 精品电影在线| 国产剧情在线观看一区二区| 午夜精品久久久99热福利| 欧美人与性囗牲恔配| 国产亚洲高清在线观看| 懂色aⅴ精品一区二区三区蜜月 | 久久精品国产亚洲5555| 欧美亚洲综合色| www.国产二区| 麻豆亚洲av熟女国产一区二| а√中文在线资源库| 欧美精品日韩| 一区二区三区视频在线| 在线观看免费视频国产| 欧美黑粗硬大| 色婷婷香蕉在线一区二区| 免费观看亚洲视频| 欧美三级理伦电影| 久久欧美一区二区| 国产伦精品一区二区三区免费视频| 中文字幕在线播出| 国产视频一区在线观看一区免费| 欧美久久精品午夜青青大伊人| 一级黄色性视频| 国产精品极品| 91精品欧美福利在线观看| 少妇人妻互换不带套| а√天堂8资源在线| 一区二区三区在线影院| 中文字幕乱码一区二区三区 | 972aa.com艺术欧美| 91久久在线视频| 一区二区视频免费| 日韩专区在线视频| 日本精品va在线观看| 日产电影一区二区三区| 激情亚洲成人| 欧美美女18p| 午夜精品一区二区三区视频| 日韩欧美中字| 色噜噜狠狠色综合网图区 | 1区2区3区精品视频| 日韩免费av一区二区三区| 免费一级毛片在线观看| 久久夜色精品国产噜噜av | 成人精品一区二区| 成人a'v在线播放| 亚洲深夜福利在线| 加勒比一区二区| 亚洲精品小区久久久久久| 亚洲精品国产suv| 99re久久精品国产| 免费成人网www| 亚洲欧洲日韩国产| 91麻豆精品国产91久久综合| 欧美日韩水蜜桃| 色噜噜国产精品视频一区二区 | 亚洲一区免费观看| 久久在线中文字幕| 黄频免费在线观看| 色偷偷成人一区二区三区91| 看欧美ab黄色大片视频免费 | 欧美日韩亚洲综合| 奇米影视四色在线| 精品中文字幕一区二区三区四区| 日韩精品中文字幕一区二区三区 | 精品这里只有精品| 国产高清不卡| 欧美日韩综合色| 久久精品国产99久久99久久久| 一区二区日韩| 精品网站999www| 99久久99久久精品免费| 久久久久久久久久久久久久久久久久| 欧美大片在线免费观看| 国产a∨精品一区二区三区仙踪林| 免费久久99精品国产自在现线| 国产精品福利网| 国产强伦人妻毛片| 99免费精品视频| 日韩国产精品一区二区| 欧美片一区二区| 欧美日韩国产网站| 制服丝袜日韩国产| 国产免费一区二区三区最新6| 久久99国产精一区二区三区| 久久精品国产欧美激情| 国产无遮挡又黄又爽又色| 久久久久国产精品一区三寸| 成人av番号网| 亚洲人妻一区二区三区| 国产精品久99| 国产精品沙发午睡系列| 日韩国产大片| 亚洲免费小视频| 久久精品黄色片| 葵司免费一区二区三区四区五区| 国产精品亚洲美女av网站| 韩国中文字幕hd久久精品| 欧美国产综合一区二区| 日韩人妻无码精品久久久不卡| 日韩成人亚洲| 亚洲成人久久网| 午夜精品久久久久99蜜桃最新版| 亚洲一区不卡| 亚洲综合色av| 日本在线www| 日韩欧美国产黄色| 日韩大尺度视频| 久久精品国产www456c0m| 2019日本中文字幕| 国产99久一区二区三区a片| 国产视频一区二区在线| 97在线国产视频| 亚洲网站免费| 国产一区二区三区在线观看网站| 久久精品一区二区三| 久久精品国产999大香线蕉| 乱色588欧美| 丁香花在线影院| 91精品国产91久久久久久最新毛片| 国产美女精品久久| 亚洲伦伦在线| 国产精品久久久对白| 中文字幕66页| 欧美二区观看| 爱福利视频一区| 中文字幕视频在线播放| 久久久不卡网国产精品二区| av在线播放亚洲| 91成人午夜| 欧美激情亚洲国产| 精品国产99久久久久久宅男i| 国产精品免费av| 天天影视综合色| 久久不见久久见免费视频7| 55夜色66夜色国产精品视频| 韩国av免费在线观看| 一区二区三区四区高清精品免费观看 | 国产日韩中文字幕| av在线播放av| 欧美午夜免费电影| 美国精品一区二区| 美女视频一区二区三区| 亚洲欧美日韩国产yyy| 99九九久久| 中文字幕亚洲欧美| 一区二区三区www污污污网站| 国产免费观看久久| 亚洲第一狼人区| 色综合狠狠操| 91啪国产在线| 欧美xxx黑人xxx水蜜桃| 日韩欧美成人激情| 国产精品50页| 久久影院电视剧免费观看| 激情视频综合网| 青青草国产免费一区二区下载| 国产精品无av码在线观看| 91福利在线视频| 91精品午夜视频| 国产大片中文字幕在线观看| 99精品黄色片免费大全| 国产精品第12页| 日韩一区二区在线免费| 91在线中文字幕| 四虎永久免费观看| jvid一区二区三区| 久久亚洲精品成人| av官网在线观看| 亚洲mv在线观看| 国产全是老熟女太爽了| 裸体在线国模精品偷拍| 久久精品无码中文字幕| 免费一区二区三区视频导航| 国产精品偷伦视频免费观看国产| 国产乱色在线观看| 亚洲第一精品久久忘忧草社区| 高清乱码免费看污| 亚洲视频一区二区免费在线观看| 黄色av电影网站| 日韩电影在线一区二区| 亚洲国产一二三精品无码| 丝袜久久网站| 亚洲一区国产精品| 日本不卡一二三| 欧美日韩国产123| 久蕉在线视频| 精品国产免费视频| 欧美男人天堂网| 亚洲第一成人在线| av在线播放中文字幕| 成人综合婷婷国产精品久久免费| 欧美牲交a欧美牲交aⅴ免费真 | 国产+成+人+亚洲欧洲自线| 国产黄色特级片| 国色天香一区二区| 亚洲巨乳在线观看| 林ゆな中文字幕一区二区| 91精品国产综合久久久久久久久| а√在线天堂官网| 精品国模在线视频| 美丽的姑娘在线观看免费动漫| 91精品国产入口| 色老头在线视频| 亚洲一区二区三区四区的| 久久久视频6r| 91丨porny丨首页| 国产精品99久久久精品无码| 蜜桃视频第一区免费观看| 精品少妇一区二区三区在线| 亚洲欧美文学| 国产亚洲精品美女久久久| 最新国产精品自拍| 麻豆91小视频| 欧洲熟妇精品视频| 国产精品一二| 日韩在线观看a| 伊人色**天天综合婷婷| 亚洲天堂电影网| 免费一区二区三区视频导航| 精品国产一区二区三区麻豆小说 | 久一区二区三区| **性色生活片久久毛片| 国产一区二区三区精品在线| 91香蕉国产在线观看软件| 丰满熟女人妻一区二区三区| 国产在线播放一区二区三区| 亚洲性图一区二区| 日本成人中文字幕在线视频| 国产免费视频传媒| 另类天堂av| 日日碰狠狠丁香久燥| 午夜综合激情| 免费黄色福利视频| 麻豆九一精品爱看视频在线观看免费| 亚洲 欧美 日韩 国产综合 在线 | 国产精品国产三级国产普通话三级 | 国产成人三级在线播放 | 天天干,夜夜爽| 亚洲第一页在线| 天天色综合久久| 亚洲国产精品久久91精品| 狠狠综合久久av一区二区| 精品国产亚洲在线| 天天爱天天干天天操| 亚洲精品久久7777777| 四虎精品在永久在线观看| 亚洲欧美另类人妖| 国产高清免费在线播放| 亚洲精品老司机| 激情婷婷综合网| 日本sm残虐另类| 日韩在线一区视频| 国产高清久久久| 337p日本欧洲亚洲大胆张筱雨 | 成熟人妻av无码专区| 国产精品美女久久久久aⅴ| 一本一本久久a久久| 亚洲免费大片在线观看| 久久亚洲AV无码| 欧美日韩国产页| 制服丝袜在线一区| 欧美高清www午色夜在线视频| 精品人妻一区二区三区蜜桃| 精品国产乱码久久久久久浪潮| 亚洲日本香蕉视频| 在线日韩日本国产亚洲| 国产福利视频在线| 国模私拍视频一区| 蜜桃视频成人m3u8| 95av在线视频| 伊人久久大香线蕉综合网蜜芽| 亚洲高清视频在线观看| 欧美精品aa| 国产aaa一级片| 久久99久久久欧美国产| 中文字幕一区二区三区人妻在线视频| 99久久免费视频.com| 国产精品久久久视频| 一区二区久久久| 黄瓜视频在线免费观看| 在线播放视频一区| 色鬼7777久久| 久久精品在线播放| 亚洲精品动漫| 91精品黄色| 久久91成人| www.在线观看av| 蜜臀av性久久久久蜜臀aⅴ| 欧美xxxxx少妇| 国产精品高清亚洲| 国产又粗又爽视频| 日韩一区二区高清| 阿v免费在线观看| 欧美激情手机在线视频| 成人av集中营| 精品久久精品久久| 欧美成人有码| 亚洲欧美日韩一级| 久久综合九色综合97婷婷女人| 91麻豆免费视频网站| 色诱亚洲精品久久久久久| 亚洲第一视频在线| 亚洲激情午夜| 国产午夜大地久久| 国产精品66部| 美女福利视频网| 91国产成人在线| 人妻一区二区三区| 欧美老少做受xxxx高潮| 欧美在线一级| 日韩欧美一区二区视频在线播放| 影音先锋久久| 中国老熟女重囗味hdxx| 国产精品伦一区二区三级视频| 久久人妻免费视频| 亚洲第一页自拍| 日本乱理伦在线| 92国产精品久久久久首页 | 亚洲成人第一网站| 亚洲第一男人天堂| 欧美伦理免费在线| 91色视频在线观看| 国产精品国产三级国产在线观看| 少妇性l交大片| 久久综合视频网| www.毛片.com| 日韩精品极品毛片系列视频| 黄色成人在线网| 国产a一区二区| 韩日在线一区| 日本三级日本三级日本三级极| 亚洲自拍偷拍九九九| 亚洲国产福利视频| 久久91精品国产| 粉嫩的18在线观看极品精品| 欧美高清中文字幕| 成人av网址在线观看| 日韩xxx高潮hd| 亚洲精品二三区| 伊人网在线播放| 蜜桃麻豆www久久国产精品| 在线亚洲伦理| 一区二区黄色片| 色偷偷成人一区二区三区91| 女人偷人在线视频| 国产精品h片在线播放| 欧美色图一区| 久国产精品视频| 亚洲精品免费在线| 日本人妻丰满熟妇久久久久久| 久久久免费精品视频| 欧美精品密入口播放| 777久久久精品一区二区三区| 91亚洲精品久久久蜜桃网站 | 日本亚洲最大的色成网站www| 久久午夜福利电影| 国产成人自拍高清视频在线免费播放| 日本免费黄色小视频| 久久成人麻豆午夜电影| 欧美黄色aaa| 欧美精品一区二区三区四区| 国模精品视频| 性欧美精品一区二区三区在线播放 | www.中文字幕久久久| 成人国内精品久久久久一区| 欧美日韩国产高清| 国产精品无码永久免费不卡| 欧美亚洲一区二区在线| 精品美女在线观看视频在线观看 | 色小子综合网| 无码人妻久久一区二区三区蜜桃| 五月激情综合色| 95在线视频| 国产在线播放一区二区| 日韩成人一区二区三区在线观看| 日本高清不卡免费| 亚洲缚视频在线观看| 欧美aaa大片视频一二区| 日本美女爱爱视频| 国产亚洲精品久| va视频在线观看| 国产97免费视| 欧美女激情福利| 国产精品高清无码在线观看| 日韩午夜精品电影| 怡红院成人在线| 日本一本中文字幕| 国产精品免费人成网站| 天堂v在线观看| 91亚洲午夜在线| 日韩av中文字幕一区二区三区| 九九热视频精品| 中日韩美女免费视频网站在线观看|