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

高并發秒殺系統架構解密,不是所有的秒殺都是秒殺!

開發 架構
作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。

[[346095]]

作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。為使更多童鞋受益,現給出開源框架地址:https://github.com/sunshinelyz/mykit-delay

寫在前面

很多小伙伴反饋說,高并發專題學了那么久,但是,在真正做項目時,仍然不知道如何下手處理高并發業務場景!甚至很多小伙伴仍然停留在只是簡單的提供接口(CRUD)階段,不知道學習的并發知識如何運用到實際項目中,就更別提如何構建高并發系統了!

究竟什么樣的系統算是高并發系統?今天,我們就一起解密高并發業務場景下典型的秒殺系統的架構,結合高并發專題下的其他文章,學以致用。

電商系統架構在電商領域,存在著典型的秒殺業務場景,那何謂秒殺場景呢。簡單的來說就是一件商品的購買人數遠遠大于這件商品的庫存,而且這件商品在很短的時間內就會被搶購一空。比如每年的618、雙11大促,小米新品促銷等業務場景,就是典型的秒殺業務場景。

我們可以將電商系統的架構簡化成下圖所示。

 

由圖所示,我們可以簡單的將電商系統的核心層分為:負載均衡層、應用層和持久層。接下來,我們就預估下每一層的并發量。

  • 假如負載均衡層使用的是高性能的Nginx,則我們可以預估Nginx最大的并發度為:10W+,這里是以萬為單位。
  • 假設應用層我們使用的是Tomcat,而Tomcat的最大并發度可以預估為800左右,這里是以百為單位。
  • 假設持久層的緩存使用的是Redis,數據庫使用的是MySQL,MySQL的最大并發度可以預估為1000左右,以千為單位。Redis的最大并發度可以預估為5W左右,以萬為單位。

所以,負載均衡層、應用層和持久層各自的并發度是不同的,那么,為了提升系統的總體并發度和緩存,我們通常可以采取哪些方案呢?

(1)系統擴容

系統擴容包括垂直擴容和水平擴容,增加設備和機器配置,絕大多數的場景有效。

(2)緩存

本地緩存或者集中式緩存,減少網絡IO,基于內存讀取數據。大部分場景有效。

(3)讀寫分離

采用讀寫分離,分而治之,增加機器的并行處理能力。

秒殺系統的特點對于秒殺系統來說,我們可以從業務和技術兩個角度來闡述其自身存在的一些特點。

秒殺系統的業務特點

這里,我們可以使用12306網站來舉例,每年春運時,12306網站的訪問量是非常大的,但是網站平時的訪問量卻是比較平緩的,也就是說,每年春運時節,12306網站的訪問量會出現瞬時突增的現象。

再比如,小米秒殺系統,在上午10點開售商品,10點前的訪問量比較平緩,10點時同樣會出現并發量瞬時突增的現象。

所以,秒殺系統的流量和并發量我們可以使用下圖來表示。

 

由圖可以看出,秒殺系統的并發量存在瞬時凸峰的特點,也叫做流量突刺現象。

我們可以將秒殺系統的特點總結如下。

 

(1)限時、限量、限價

在規定的時間內進行;秒殺活動中商品的數量有限;商品的價格會遠遠低于原來的價格,也就是說,在秒殺活動中,商品會以遠遠低于原來的價格出售。

例如,秒殺活動的時間僅限于某天上午10點到10點半,商品數量只有10萬件,售完為止,而且商品的價格非常低,例如:1元購等業務場景。

限時、限量和限價可以單獨存在,也可以組合存在。

(2)活動預熱

需要提前配置活動;活動還未開始時,用戶可以查看活動的相關信息;秒殺活動開始前,對活動進行大力宣傳。

(3)持續時間短

購買的人數數量龐大;商品會迅速售完。

在系統流量呈現上,就會出現一個突刺現象,此時的并發訪問量是非常高的,大部分秒殺場景下,商品會在極短的時間內售完。

秒殺系統的技術特點

我們可以將秒殺系統的技術特點總結如下。

 

(1)瞬時并發量非常高

大量用戶會在同一時間搶購商品;瞬間并發峰值非常高。

(2)讀多寫少

系統中商品頁的訪問量巨大;商品的可購買數量非常少;庫存的查詢訪問數量遠遠大于商品的購買數量。

在商品頁中往往會加入一些限流措施,例如早期的秒殺系統商品頁會加入驗證碼來平滑前端對系統的訪問流量,近期的秒殺系統商品詳情頁會在用戶打開頁面時,提示用戶登錄系統。這都是對系統的訪問進行限流的一些措施。

(3)流程簡單

秒殺系統的業務流程一般比較簡單;總體上來說,秒殺系統的業務流程可以概括為:下單減庫存。

秒殺三階段

通常,從秒殺開始到結束,往往會經歷三個階段:

準備階段:這個階段也叫作系統預熱階段,此時會提前預熱秒殺系統的業務數據,往往這個時候,用戶會不斷刷新秒殺頁面,來查看秒殺活動是否已經開始。在一定程度上,通過用戶不斷刷新頁面的操作,可以將一些數據存儲到Redis中進行預熱。

秒殺階段:這個階段主要是秒殺活動的過程,會產生瞬時的高并發流量,對系統資源會造成巨大的沖擊,所以,在秒殺階段一定要做好系統防護。

結算階段: 完成秒殺后的數據處理工作,比如數據的一致性問題處理,異常情況處理,商品的回倉處理等。

針對這種短時間內大流量的系統來說,就不太適合使用系統擴容了,因為即使系統擴容了,也就是在很短的時間內會使用到擴容后的系統,大部分時間內,系統無需擴容即可正常訪問。那么,我們可以采取哪些方案來提升系統的秒殺性能呢?

秒殺系統方案

針對秒殺系統的特點,我們可以采取如下的措施來提升系統的性能。 

 

(1)異步解耦

將整體流程進行拆解,核心流程通過隊列方式進行控制。

(2)限流防刷

控制網站整體流量,提高請求的門檻,避免系統資源耗盡。

(3)資源控制

將整體流程中的資源調度進行控制,揚長避短。

由于應用層能夠承載的并發量比緩存的并發量少很多。所以,在高并發系統中,我們可以直接使用OpenResty由負載均衡層訪問緩存,避免了調用應用層的性能損耗。大家可以到https://openresty.org/cn/來了解有關OpenResty更多的知識。同時,由于秒殺系統中,商品數量比較少,我們也可以使用動態渲染技術,CDN技術來加速網站的訪問性能。

如果在秒殺活動開始時,并發量太高時,我們可以將用戶的請求放入隊列中進行處理,并為用戶彈出排隊頁面。

秒殺系統時序圖

網上很多的秒殺系統和對秒殺系統的解決方案,并不是真正的秒殺系統,他們采用的只是同步處理請求的方案,一旦并發量真的上來了,他們所謂的秒殺系統的性能會急劇下降。我們先來看一下秒殺系統在同步下單時的時序圖。

同步下單流程 

 

1.用戶發起秒殺請求

在同步下單流程中,首先,用戶發起秒殺請求。商城服務需要依次執行如下流程來處理秒殺請求的業務。

(1)識別驗證碼是否正確

商城服務判斷用戶發起秒殺請求時提交的驗證碼是否正確。

(2)判斷活動是否已經結束

驗證當前秒殺活動是否已經結束。

(3)驗證訪問請求是否處于黑名單

在電商領域中,存在著很多的惡意競爭,也就是說,其他商家可能會通過不正當手段來惡意請求秒殺系統,占用系統大量的帶寬和其他系統資源。此時,就需要使用風控系統等實現黑名單機制。為了簡單,也可以使用攔截器統計訪問頻次實現黑名單機制。

(4)驗證真實庫存是否足夠

系統需要驗證商品的真實庫存是否足夠,是否能夠支持本次秒殺活動的商品庫存量。

(5)扣減緩存中的庫存

在秒殺業務中,往往會將商品庫存等信息存放在緩存中,此時,還需要驗證秒殺活動使用的商品庫存是否足夠,并且需要扣減秒殺活動的商品庫存數量。

(6)計算秒殺的價格

由于在秒殺活動中,商品的秒殺價格和商品的真實價格存在差異,所以,需要計算商品的秒殺價格。

注意:如果在秒殺場景中,系統涉及的業務更加復雜的話,會涉及更多的業務操作,這里,我只是列舉出一些常見的業務操作。

2.提交訂單

(1)訂單入口

將用戶提交的訂單信息保存到數據庫中。

(2)扣減真實庫存

訂單入庫后,需要在商品的真實庫存中將本次成功下單的商品數量扣除。

如果我們使用上述流程開發了一個秒殺系統,當用戶發起秒殺請求時,由于系統每個業務流程都是串行執行的,整體上系統的性能不會太高,當并發量太高時,我們會為用戶彈出下面的排隊頁面,來提示用戶進行等待。

此時的排隊時間可能是15秒,也可能是30秒,甚至是更長時間。這就存在一個問題:在用戶發起秒殺請求到服務器返回結果的這段時間內,客戶端和服務器之間的連接不會被釋放,這就會占大量占用服務器的資源。

網上很多介紹如何實現秒殺系統的文章都是采用的這種方式,那么,這種方式能做秒殺系統嗎?答案是可以做,但是這種方式支撐的并發量并不是太高。此時,有些網友可能會問:我們公司就是這樣做的秒殺系統啊!上線后一直在用,沒啥問題啊!我想說的是:使用同步下單方式確實可以做秒殺系統,但是同步下單的性能不會太高。之所以你們公司采用同步下單的方式做秒殺系統沒出現大的問題,那是因為你們的秒殺系統的并發量沒達到一定的量級,也就是說,你們的秒殺系統的并發量其實并不高。

所以,很多所謂的秒殺系統,存在著秒殺的業務,但是稱不上真正的秒殺系統,原因就在于他們使用的是同步的下單流程,限制了系統的并發流量。之所以上線后沒出現太大的問題,是因為系統的并發量不高,不足以壓死整個系統。

如果12306、淘寶、天貓、京東、小米等大型商城的秒殺系統是這么玩的話,那么,他們的系統遲早會被玩死,他們的系統工程師不被開除才怪!所以,在秒殺系統中,這種同步處理下單的業務流程的方案是不可取的。

以上就是同步下單的整個流程操作,如果下單流程更加復雜的話,就會涉及到更多的業務操作。

異步下單流程

既然同步下單流程的秒殺系統稱不上真正的秒殺系統,那我們就需要采用異步的下單流程了。異步的下單流程不會限制系統的高并發流量。

 

1.用戶發起秒殺請求

用戶發起秒殺請求后,商城服務會經過如下業務流程。

(1)檢測驗證碼是否正確

用戶發起秒殺請求時,會將驗證碼一同發送過來,系統會檢驗驗證碼是否有效,并且是否正確。

(2)是否限流

系統會對用戶的請求進行是否限流的判斷,這里,我們可以通過判斷消息隊列的長度來進行判斷。因為我們將用戶的請求放在了消息隊列中,消息隊列中堆積的是用戶的請求,我們可以根據當前消息隊列中存在的待處理的請求數量來判斷是否需要對用戶的請求進行限流處理。

例如,在秒殺活動中,我們出售1000件商品,此時在消息隊列中存在1000個請求,如果后續仍然有用戶發起秒殺請求,則后續的請求我們可以不再處理,直接向用戶返回商品已售完的提示。

[[346100]] 

所以,使用限流后,我們可以更快的處理用戶的請求和釋放連接的資源。

(3)發送MQ

用戶的秒殺請求通過前面的驗證后,我們就可以將用戶的請求參數等信息發送到MQ中進行異步處理,同時,向用戶響應結果信息。在商城服務中,會有專門的異步任務處理模塊來消費消息隊列中的請求,并處理后續的異步流程。

在用戶發起秒殺請求時,異步下單流程比同步下單流程處理的業務操作更少,它將后續的操作通過MQ發送給異步處理模塊進行處理,并迅速向用戶返回響應結果,釋放請求連接。

2.異步處理

我們可以將下單流程的如下操作進行異步處理。

(1)判斷活動是否已經結束

(2)判斷本次請求是否處于系統黑名單,為了防止電商領域同行的惡意競爭可以為系統增加黑名單機制,將惡意的請求放入系統的黑名單中。可以使用攔截器統計訪問頻次來實現。

(3)扣減緩存中的秒殺商品的庫存數量。

(4)生成秒殺Token,這個Token是綁定當前用戶和當前秒殺活動的,只有生成了秒殺Token的請求才有資格進行秒殺活動。

這里我們引入了異步處理機制,在異步處理中,系統使用多少資源,分配多少線程來處理相應的任務,是可以進行控制的。

3.短輪詢查詢秒殺結果

這里,可以采取客戶端短輪詢查詢是否獲得秒殺資格的方案。例如,客戶端可以每隔3秒鐘輪詢請求服務器,查詢是否獲得秒殺資格,這里,我們在服務器的處理就是判斷當前用戶是否存在秒殺Token,如果服務器為當前用戶生成了秒殺Token,則當前用戶存在秒殺資格。否則繼續輪詢查詢,直到超時或者服務器返回商品已售完或者無秒殺資格等信息為止。

采用短輪詢查詢秒殺結果時,在頁面上我們同樣可以提示用戶排隊處理中,但是此時客戶端會每隔幾秒輪詢服務器查詢秒殺資格的狀態,相比于同步下單流程來說,無需長時間占用請求連接。

此時,可能會有網友會問:采用短輪詢查詢的方式,會不會存在直到超時也查詢不到是否具有秒殺資格的狀態呢?答案是:有可能! 這里我們試想一下秒殺的真實場景,商家參加秒殺活動本質上不是為了賺錢,而是提升商品的銷量和商家的知名度,吸引更多的用戶來買自己的商品。所以,我們不必保證用戶能夠100%的查詢到是否具有秒殺資格的狀態。

4.秒殺結算

(1)驗證下單Token

客戶端提交秒殺結算時,會將秒殺Token一同提交到服務器,商城服務會驗證當前的秒殺Token是否有效。

(2)加入秒殺購物車

商城服務在驗證秒殺Token合法并有效后,會將用戶秒殺的商品添加到秒殺購物車。

5.提交訂單

(1)訂單入庫

將用戶提交的訂單信息保存到數據庫中。

(2)刪除Token

秒殺商品訂單入庫成功后,刪除秒殺Token。

這里大家可以思考一個問題:我們為什么只在異步下單流程的粉色部分采用異步處理,而沒有在其他部分采取異步削峰和填谷的措施呢?

這是因為在異步下單流程的設計中,無論是在產品設計上還是在接口設計上,我們在用戶發起秒殺請求階段對用戶的請求進行了限流操作,可以說,系統的限流操作是非常前置的。在用戶發起秒殺請求時進行了限流,系統的高峰流量已經被平滑解決了,再往后走,其實系統的并發量和系統流量并不是非常高了。

所以,網上很多的文章和帖子中在介紹秒殺系統時,說是在下單時使用異步削峰來進行一些限流操作,那都是在扯淡!因為下單操作在整個秒殺系統的流程中屬于比較靠后的操作了,限流操作一定要前置處理,在秒殺業務后面的流程中做限流操作是沒啥卵用的。

高并發“黑科技”與致勝奇招

假設,在秒殺系統中我們使用Redis實現緩存,假設Redis的讀寫并發量在5萬左右。我們的商城秒殺業務需要支持的并發量在100萬左右。如果這100萬的并發全部打入Redis中,Redis很可能就會掛掉,那么,我們如何解決這個問題呢?接下來,我們就一起來探討這個問題。

在高并發的秒殺系統中,如果采用Redis緩存數據,則Redis緩存的并發處理能力是關鍵,因為很多的前綴操作都需要訪問Redis。而異步削峰只是基本的操作,關鍵還是要保證Redis的并發處理能力。

解決這個問題的關鍵思想就是:分而治之,將商品庫存分開放。

暗度陳倉

我們在Redis中存儲秒殺商品的庫存數量時,可以將秒殺商品的庫存進行“分割”存儲來提升Redis的讀寫并發量。

例如,原來的秒殺商品的id為10001,庫存為1000件,在Redis中的存儲為(10001, 1000),我們將原有的庫存分割為5份,則每份的庫存為200件,此時,我們在Redia中存儲的信息為(10001_0, 200),(10001_1, 200),(10001_2, 200),(10001_3, 200),(10001_4, 200)。

 

此時,我們將庫存進行分割后,每個分割后的庫存使用商品id加上一個數字標識來存儲,這樣,在對存儲商品庫存的每個Key進行Hash運算時,得出的Hash結果是不同的,這就說明,存儲商品庫存的Key有很大概率不在Redis的同一個槽位中,這就能夠提升Redis處理請求的性能和并發量。

分割庫存后,我們還需要在Redis中存儲一份商品id和分割庫存后的Key的映射關系,此時映射關系的Key為商品的id,也就是10001,Value為分割庫存后存儲庫存信息的Key,也就是10001_0,10001_1,10001_2,10001_3,10001_4。在Redis中我們可以使用List來存儲這些值。

在真正處理庫存信息時,我們可以先從Redis中查詢出秒殺商品對應的分割庫存后的所有Key,同時使用AtomicLong來記錄當前的請求數量,使用請求數量對從Redia中查詢出的秒殺商品對應的分割庫存后的所有Key的長度進行求模運算,得出的結果為0,1,2,3,4。再在前面拼接上商品id就可以得出真正的庫存緩存的Key。此時,就可以根據這個Key直接到Redis中獲取相應的庫存信息。

移花接木

在高并發業務場景中,我們可以直接使用Lua腳本庫(OpenResty)從負載均衡層直接訪問緩存。

這里,我們思考一個場景:如果在秒殺業務場景中,秒殺的商品被瞬間搶購一空。此時,用戶再發起秒殺請求時,如果系統由負載均衡層請求應用層的各個服務,再由應用層的各個服務訪問緩存和數據庫,其實,本質上已經沒有任何意義了,因為商品已經賣完了,再通過系統的應用層進行層層校驗已經沒有太多意義了!!而應用層的并發訪問量是以百為單位的,這又在一定程度上會降低系統的并發度。

為了解決這個問題,此時,我們可以在系統的負載均衡層取出用戶發送請求時攜帶的用戶id,商品id和秒殺活動id等信息,直接通過Lua腳本等技術來訪問緩存中的庫存信息。如果秒殺商品的庫存小于或者等于0,則直接返回用戶商品已售完的提示信息,而不用再經過應用層的層層校驗了。 針對這個架構,我們可以參見本文中的電商系統的架構圖(正文開始的第一張圖)。

Redis助力秒殺系統

我們可以在Redis中設計一個Hash數據結構,來支持商品庫存的扣減操作,如下所示。

  1. seckill:goodsStock:${goodsId}{ 
  2.  totalCount:200, 
  3.  initStatus:0, 
  4.  seckillCount:0 

在我們設計的Hash數據結構中,有三個非常主要的屬性。

  • totalCount:表示參與秒殺的商品的總數量,在秒殺活動開始前,我們就需要提前將此值加載到Redis緩存中。
  • initStatus:我們把這個值設計成一個布爾值。秒殺開始前,這個值為0,表示秒殺未開始。可以通過定時任務或者后臺操作,將此值修改為1,則表示秒殺開始。
  • seckillCount:表示秒殺的商品數量,在秒殺過程中,此值的上限為totalCount,當此值達到totalCount時,表示商品已經秒殺完畢。

我們可以通過下面的代碼片段在秒殺預熱階段,將要參與秒殺的商品數據加載的緩存。

  1. /** 
  2.  * @author binghe 
  3.  * @description 秒殺前構建商品緩存代碼示例 
  4.  */ 
  5. public class SeckillCacheBuilder{ 
  6.     private static final String GOODS_CACHE = "seckill:goodsStock:";  
  7.     private String getCacheKey(String id) {  
  8.         return  GOODS_CACHE.concat(id); 
  9.     }  
  10.     public void prepare(String id, int totalCount) {  
  11.         String key = getCacheKey(id);  
  12.         Map<String, Integer> goods = new HashMap<>();  
  13.         goods.put("totalCount", totalCount);  
  14.         goods.put("initStatus", 0);  
  15.         goods.put("seckillCount", 0);  
  16.         redisTemplate.opsForHash().putAll(key, goods);  
  17.      } 

秒殺開始的時候,我們需要在代碼中首先判斷緩存中的seckillCount值是否小于totalCount值,如果seckillCount值確實小于totalCount值,我們才能夠對庫存進行鎖定。在我們的程序中,這兩步其實并不是原子性的。如果在分布式環境中,我們通過多臺機器同時操作Redis緩存,就會發生同步問題,進而引起“超賣”的嚴重后果。

在電商領域,有一個專業名詞叫作“超賣”。顧名思義:“超賣”就是說賣出的商品數量比商品的庫存數量多,這在電商領域是一個非常嚴重的問題。那么,我們如何解決“超賣”問題呢?

Lua腳本完美解決超賣問題

我們如何解決多臺機器同時操作Redis出現的同步問題呢?一個比較好的方案就是使用Lua腳本。我們可以使用Lua腳本將Redis中扣減庫存的操作封裝成一個原子操作,這樣就能夠保證操作的原子性,從而解決高并發環境下的同步問題。

例如,我們可以編寫如下的Lua腳本代碼,來執行Redis中的庫存扣減操作。

  1. local resultFlag = "0"  
  2. local n = tonumber(ARGV[1])  
  3. local key = KEYS[1]  
  4. local goodsInfo = redis.call("HMGET",key,"totalCount","seckillCount")  
  5. local total = tonumber(goodsInfo[1])  
  6. local alloc = tonumber(goodsInfo[2])  
  7. if not total then  
  8.     return resultFlag  
  9. end  
  10. if total >= alloc + n  then  
  11.     local ret = redis.call("HINCRBY",key,"seckillCount",n)  
  12.     return tostring(ret)  
  13. end  
  14. return resultFlag 

我們可以使用如下的Java代碼來調用上述Lua腳本。

  1. public int secKill(String id, int number) {  
  2.     String key = getCacheKey(id);  
  3.     Object seckillCount =  redisTemplate.execute(script, Arrays.asList(key), String.valueOf(number));  
  4.     return Integer.valueOf(seckillCount.toString());  

這樣,我們在執行秒殺活動時,就能夠保證操作的原子性,從而有效的避免數據的同步問題,進而有效的解決了“超賣”問題。

本文轉載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉載本文請聯系冰河技術公眾號。

 

責任編輯:武曉燕 來源: 冰河技術
相關推薦

2018-09-15 04:59:01

2024-09-23 08:03:13

2024-07-03 11:01:55

2025-02-20 00:01:00

2021-06-23 06:48:42

秒殺Java電商

2020-04-01 17:31:03

Redis系統秒殺

2019-07-23 13:32:13

Java開發代碼

2023-11-27 18:07:05

Go并發編程

2025-01-20 00:00:03

高并發秒殺業務

2019-10-30 16:54:08

golangredis數據庫

2020-04-13 08:33:39

高并發秒殺系統

2022-08-26 10:24:48

架構Golang

2021-08-26 08:24:33

高并發秒殺系統

2018-06-24 08:40:21

秒殺架構架構優化

2025-05-28 02:20:00

2024-08-01 11:38:40

2020-09-01 07:47:32

Redis秒殺微信

2025-07-21 03:11:00

2025-04-08 05:00:00

點贊
收藏

51CTO技術棧公眾號

国产精品sm调教免费专区| 亚洲综合自拍网| а√天堂资源地址在线下载| 国产精品1区2区3区在线观看| 欧美高清性猛交| 亚洲专区区免费| 亚洲精品69| 精品美女久久久久久免费| 日韩精品一区二区三区丰满| 国产强被迫伦姧在线观看无码| 亚洲日本黄色| 色婷婷综合久久久久| 国内精品免费视频| 成人国产精品| 亚洲成人免费视| 一区二区三区四区欧美| 涩涩视频免费看| 久久se这里有精品| 欧美亚洲激情在线| 欧美成人精品欧美一级私黄| 国产伦精品一区二区三区千人斩 | 91玉足脚交白嫩脚丫在线播放| 国产福利视频一区| 国产亚洲精品成人| 色偷偷综合网| 亚洲人精品午夜在线观看| 麻豆短视频在线观看| 青草综合视频| 色呦呦网站一区| 国产欧美日韩网站| 综合久久2019| 中文字幕一区av| 日韩精品电影网站| 视频一区二区三区在线看免费看| 国产丶欧美丶日本不卡视频| 国产精品视频免费在线| 中文在线第一页| 亚洲成人原创| 久久久久久伊人| 国产亚洲欧美精品久久久www| 国产精品久久久久久麻豆一区软件| 亚洲毛片在线免费观看| 人妻av一区二区| 亚洲91网站| 日韩一区二区三区在线观看| 久久久久xxxx| 日日夜夜精品| 欧美乱熟臀69xxxxxx| 国产一线二线三线在线观看| 国产精品专区免费| 日韩欧美在线一区| 成人小视频在线看| 色婷婷综合久久久中字幕精品久久| 精品国产91久久久久久| 日韩av新片网| 大桥未久在线视频| 激情久久av一区av二区av三区| 18黄暴禁片在线观看| 成人精品一二三区| 妖精视频一区二区三区免费观看| 日韩电影中文 亚洲精品乱码| 在线观看亚洲免费视频| 97久久综合区小说区图片区| 日韩美女一区二区三区四区| 亚洲熟女一区二区三区| av成人综合| 亚洲护士老师的毛茸茸最新章节| 久久久国产精品无码| 亚洲品质自拍| 搡老女人一区二区三区视频tv| 国产91在线播放九色| 91成人精品视频| 色综合导航网站| 尤物视频在线观看国产| 久久久夜精品| 国产精品亚洲精品| 国产视频一区二区三| 顶级嫩模精品视频在线看| 国产伦精品一区二区三区免费视频| 日本高清视频www| 久久这里只精品最新地址| 亚洲欧美国产不卡| 欧美xxxxhdvideosex| 黑人巨大精品欧美一区二区三区| 激情视频综合网| 国产区一区二| 亚洲精品久久久久久久久久久| 国产交换配乱淫视频免费| 成人6969www免费视频| 久久天天躁狠狠躁老女人| 日本三级欧美三级| 秋霞电影一区二区| 97人人澡人人爽| 撸视在线观看免费视频| 亚洲丝袜另类动漫二区| 日韩国产欧美亚洲| 激情欧美一区二区三区黑长吊| 日韩欧美国产成人一区二区| 内射中出日韩无国产剧情| 91久久电影| 26uuu另类亚洲欧美日本老年| 91国内精品久久久| 99re亚洲国产精品| 国产美女视频免费| 最新欧美色图| 日韩一区二区三区三四区视频在线观看 | 一级片一级片一级片| 夜夜嗨一区二区| 91九色精品视频| 国产永久av在线| 亚洲一区二区精品视频| 亚洲精品久久久中文字幕| 精品国产一区二区三区成人影院 | 亚洲精品一区二区三区蜜桃久| 亚洲卡一卡二| 欧美日韩国产一级二级| 亚洲国产欧美视频| 狠狠88综合久久久久综合网| 国产精品丝袜一区二区三区| 午夜影院在线视频| 洋洋成人永久网站入口| 美女网站视频黄色| 自拍欧美一区| 久久人人看视频| 国产黄色片免费观看| 国产精品无圣光一区二区| 国产深夜男女无套内射| 亚洲一区二区三区日本久久九| 中文字幕精品久久久久| 成人免费视频国产免费| av不卡免费在线观看| av久久久久久| 成人51免费| 久久精品99久久香蕉国产色戒| 视频一区二区三区四区五区| 不卡的av网站| 国产3p露脸普通话对白| 日本综合精品一区| 久热99视频在线观看| 一级黄色a毛片| 中文字幕av在线一区二区三区| 99re在线视频免费观看| 久草精品在线| 情事1991在线| 九色在线播放| 色综合久久久久综合体| 国产精品无码午夜福利| 久久久久久9| 日韩一本精品| 成人18视频在线观看| 中文字幕精品网| 亚洲自拍偷拍另类| 1024成人网| 99精品视频国产| 亚洲国产成人精品女人| **亚洲第一综合导航网站| 精品176二区| 精品欧美一区二区三区精品久久| 免费在线观看黄色av| 成人一区二区三区在线观看| 国产美女在线一区| 欧美一区二区三区红桃小说| 欧美性受xxxx白人性爽| 国产免费a∨片在线观看不卡| 欧美性生活大片视频| 国产又粗又猛又爽又黄的视频四季 | 91亚洲国产成人久久精品| 国产精品一区二区三区毛片淫片| 麻豆免费在线观看| 日韩一区二区免费在线电影| 国产一级做a爱免费视频| caoporn国产一区二区| 中文字幕乱码人妻综合二区三区 | 精品国产一区二区三区久久久| 91中文字幕在线视频| 亚洲人被黑人高潮完整版| 69xxx免费视频| 久久一二三区| 国产a级片免费看| 久久99精品国产自在现线| 国产精品成人aaaaa网站| 麻豆tv在线| 亚洲精品成人久久| 中文字幕丰满人伦在线| 夜夜精品浪潮av一区二区三区| jlzzjizz在线播放观看| 久久精品国产亚洲aⅴ| 日韩激情视频一区二区| 国产精品亚洲人成在99www| 成人在线视频福利| 乱馆动漫1~6集在线观看| 中文字幕亚洲欧美日韩高清| 精品黑人一区二区三区在线观看| 日韩欧美在线看| 青青操视频在线播放| 久久久久久久久蜜桃| 国产乱码一区二区三区四区| 999亚洲国产精| 中文字幕中文字幕99 | 国产一区二区剧情av在线| 人妻av中文系列| 91日韩在线| 久久久久网址| 免费观看性欧美大片无片| 国产精品91在线| 国产极品人妖在线观看| 日韩中文字幕精品视频| 天堂在线免费av| 日韩欧美色综合网站| 乱子伦一区二区三区| 亚洲国产wwwccc36天堂| 国产91在线播放九色| 久久婷婷成人综合色| 国产免费a级片| 久久99国产精品久久99| 国产成人亚洲精品无码h在线| 午夜日韩电影| 成人免费看片视频在线观看| 欧洲杯什么时候开赛| 精品在线视频一区二区| 一区二区三区在线资源| 91在线免费视频| 成人午夜一级| 国产精品免费网站| 亚洲十八**毛片| 98精品在线视频| 国内在线视频| 久久久久久久久久亚洲| а√中文在线8| 久久久成人av| av电影在线观看一区二区三区| 日韩精品在线免费观看| 黄色一级大片在线免费看国产一 | 在线观看中文av| 麻豆精品在线观看| 牛夜精品久久久久久久| 久久久亚洲一区| 十八禁视频网站在线观看| 国产精品丝袜xxxxxxx| 免费av观看网址| 99精品视频免费观看视频| 国产在线视频在线| 欧美精品偷拍| 精品少妇人欧美激情在线观看| 欧美激情偷拍| 日本一道在线观看| 欧美国产高清| 国产玉足脚交久久欧美| 亚洲精品乱码| 免费观看美女裸体网站| 夜夜精品视频| 国产精品欧美激情在线观看| 欧美一级专区| 粉嫩虎白女毛片人体| 日韩国产成人精品| 久久99999| 狠狠色综合播放一区二区| 欧美专区第二页| 成人综合婷婷国产精品久久蜜臀 | 国产精品丝袜91| 99久久久无码国产精品不卡| 国产精品成人免费精品自在线观看| 成人黄色a级片| 亚洲欧洲美洲综合色网| 农村黄色一级片| 亚洲成人一区在线| 波多野结衣一区二区在线 | 26uuu亚洲伊人春色| 345成人影院| 国产精品久久久久久久久久久久久 | 中国日本在线视频中文字幕| 色婷婷综合成人| 色呦呦呦在线观看| 欧美一性一乱一交一视频| 456亚洲精品成人影院| 国产免费亚洲高清| 亚洲精品18| 日本免费一区二区三区| 亚洲国产不卡| 啊啊啊一区二区| 麻豆91在线观看| 亚洲一区二区三区黄色| 2020日本不卡一区二区视频| 无码人中文字幕| 亚洲福利视频导航| 波多野结衣一二区| 精品久久人人做人人爰| 青春草在线观看| 久热精品在线视频| 成人免费直播| 久久网这里都是精品| 99re精彩视频| 成人小视频免费观看| 国产免费看av| 亚洲黄一区二区三区| 无码人妻av免费一区二区三区| 制服丝袜av成人在线看| 日韩av成人| 久久久久www| 色综合一本到久久亚洲91| 96pao国产成视频永久免费| 国产伦精品一区二区三区千人斩| 特级西西人体www高清大胆| 久久综合图片| 色综合久久五月| 亚洲欧美日韩中文字幕一区二区三区 | 99精品人妻无码专区在线视频区| 日韩精品高清视频| 50度灰在线| 国产精品免费小视频| 日韩福利视频一区| 免费的av在线| 日本中文字幕一区二区视频| 亚洲av人人澡人人爽人人夜夜| 亚洲欧洲成人自拍| 天天爱天天做天天爽| 亚洲黄色www| 欧美女同一区| 成人精品一区二区三区| 国产一区网站| 内射国产内射夫妻免费频道| 国产毛片精品一区| 黄色录像免费观看| 欧美性大战久久| 国产在线观看黄| 欧美亚洲成人网| 精品国产导航| 免费国产a级片| www.欧美日韩国产在线| 久久久久成人精品无码| 欧美一卡二卡在线观看| 精品美女在线观看视频在线观看 | 国产午夜精品福利| 尤物视频在线观看国产| 亚洲成av人乱码色午夜| 日韩伦理电影网站| 亚洲一区亚洲二区| 一本一本久久a久久综合精品| 亚洲成人福利在线| 中文字幕av在线一区二区三区| 无码一区二区三区| 亚洲人成电影网站色| 亚洲天堂一区二区| 日韩视频在线播放| 青青草91视频| 可以免费看av的网址| 欧美日韩国产精品自在自线| 天堂中文а√在线| 亚洲va欧美va在线观看| 亚洲最新色图| 9.1在线观看免费| 午夜伊人狠狠久久| 神马久久精品| 国产成人亚洲综合91| 青青草97国产精品麻豆| 中文字幕免费高清在线| 中文字幕在线不卡| 精品国产区一区二| 久久久久免费视频| 亚洲ab电影| 99热这里只有精品在线播放| 中文字幕在线不卡国产视频| www.99视频| 97国产精品免费视频| 久久99青青| 亚洲最大天堂网| 亚洲最新视频在线观看| 少妇人妻偷人精品一区二区| 欧美中文字幕视频| 色婷婷一区二区三区| 可以看的av网址| 欧美日韩免费看| 91最新在线| 91麻豆精品秘密入口| 国产情侣久久| 中文字幕第69页| 亚洲第一精品夜夜躁人人爽| 婷婷综合六月| 黄色小视频大全| 久久综合色综合88| 国产精品久久婷婷| 69av视频在线播放| 欧美电影三区| 国产女人18毛片水真多18| 一本到三区不卡视频| 成人在线app| 免费国产一区二区| 精品影院一区二区久久久| 精品成人免费视频| www.日韩视频| 亚洲国产最新| 岛国大片在线免费观看| 色婷婷av一区二区三区软件 | 免费观看黄网站| 一本大道av伊人久久综合| 超鹏97在线| 日韩经典在线视频| 丁香一区二区三区| 国产又粗又猛又黄又爽| 国产69久久精品成人|