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

再有人問你如何實(shí)現(xiàn)訂單到期關(guān)閉,就把這篇文章發(fā)給他!

開發(fā) 前端
Redission中定義了分布式延遲隊(duì)列RDelayedQueue,這是一種基于我們前面介紹過的zset結(jié)構(gòu)實(shí)現(xiàn)的延時(shí)隊(duì)列,它允許以指定的延遲時(shí)長將元素放到目標(biāo)隊(duì)列中。

?在電商、支付等系統(tǒng)中,一般都是先創(chuàng)建訂單(支付單),再給用戶一定的時(shí)間進(jìn)行支付,如果沒有按時(shí)支付的話,就需要把之前的訂單(支付單)取消掉。

這種類似的場景有很多,還有比如到期自動(dòng)收貨、超時(shí)自動(dòng)退款、下單后自動(dòng)發(fā)送短信等等都是類似的業(yè)務(wù)問題。

本文就從這樣的業(yè)務(wù)問題出發(fā),探討一下都有哪些技術(shù)方案,這些方案的實(shí)現(xiàn)細(xì)節(jié),以及相關(guān)的優(yōu)缺點(diǎn)都有什么?

因?yàn)楸疚囊v的內(nèi)容比較多,涉及到11種具體方案,受篇幅限制,這篇文章主要是講方案,不會涉及到具體的代碼實(shí)現(xiàn)。 因?yàn)橹灰桨父闱宄耍a實(shí)現(xiàn)不是難事兒。

一、被動(dòng)關(guān)閉

在解決這類問題的時(shí)候,有一種比較簡單的方式,那就是通過業(yè)務(wù)上的被動(dòng)方式來進(jìn)行關(guān)單操作。

簡單點(diǎn)說,就是訂單創(chuàng)建好了之后。我們系統(tǒng)上不做主動(dòng)關(guān)單,什么時(shí)候用戶來訪問這個(gè)訂單了,再去判斷時(shí)間是不是超過了過期時(shí)間,如果過了時(shí)間那就進(jìn)行關(guān)單操作,然后再提示用戶。

圖片

這種做法是最簡單的,基本不需要開發(fā)定時(shí)關(guān)閉的功能,但是他的缺點(diǎn)也很明顯,那就是如果用戶一直不來查看這個(gè)訂單,那么就會有很多臟數(shù)據(jù)冗余在數(shù)據(jù)庫中一直無法被關(guān)單。

還有一個(gè)缺點(diǎn),那就是需要在用戶的查詢過程中進(jìn)行寫的操作,一般寫操作都會比讀操作耗時(shí)更長,而且有失敗的可能,一旦關(guān)單失敗了,就會導(dǎo)致系統(tǒng)處理起來比較復(fù)雜。

所以,這種方案只適合于自己學(xué)習(xí)的時(shí)候用,任何商業(yè)網(wǎng)站中都不建議使用這種方案來實(shí)現(xiàn)訂單關(guān)閉的功能。

二、定時(shí)任務(wù)

定時(shí)任務(wù)關(guān)閉訂單,這是很容易想到的一種方案。

具體實(shí)現(xiàn)細(xì)節(jié)就是我們通過一些調(diào)度平臺來實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù),任務(wù)就是去掃描所有到期的訂單,然后執(zhí)行關(guān)單動(dòng)作。

圖片

這個(gè)方案的優(yōu)點(diǎn)也是比較簡單,實(shí)現(xiàn)起來很容易,基于Timer、ScheduledThreadPoolExecutor、或者像xxl-job這類調(diào)度框架都能實(shí)現(xiàn),但是有以下幾個(gè)問題:

1、時(shí)間不精準(zhǔn)。 一般定時(shí)任務(wù)基于固定的頻率、按照時(shí)間定時(shí)執(zhí)行的,那么就可能會發(fā)生很多訂單已經(jīng)到了超時(shí)時(shí)間,但是定時(shí)任務(wù)的調(diào)度時(shí)間還沒到,那么就會導(dǎo)致這些訂單的實(shí)際關(guān)閉時(shí)間要比應(yīng)該關(guān)閉的時(shí)間晚一些。

2、無法處理大訂單量。 定時(shí)任務(wù)的方式是會把本來比較分散的關(guān)閉時(shí)間集中到任務(wù)調(diào)度的那一段時(shí)間,如果訂單量比較大的話,那么就可能導(dǎo)致任務(wù)執(zhí)行時(shí)間很長,整個(gè)任務(wù)的時(shí)間越長,訂單被掃描到時(shí)間可能就很晚,那么就會導(dǎo)致關(guān)閉時(shí)間更晚。

3、對數(shù)據(jù)庫造成壓力。 定時(shí)任務(wù)集中掃表,這會使得數(shù)據(jù)庫IO在短時(shí)間內(nèi)被大量占用和消耗,如果沒有做好隔離,并且業(yè)務(wù)量比較大的話,就可能會影響到線上的正常業(yè)務(wù)。

4、分庫分表問題。 訂單系統(tǒng),一旦訂單量大就可能會考慮分庫分表,在分庫分表中進(jìn)行全表掃描,這是一個(gè)極不推薦的方案。

所以,定時(shí)任務(wù)的方案,適合于對時(shí)間精確度要求不高、并且業(yè)務(wù)量不是很大的場景中。如果對時(shí)間精度要求比較高,并且業(yè)務(wù)量很大的話,這種方案不適用。

三、JDK自帶的延遲隊(duì)列

有這樣一種方案,他不需要借助任何外部的資源,直接基于應(yīng)用自身就能實(shí)現(xiàn),那就是基于JDK自帶的DelayQueue來實(shí)現(xiàn)

DelayQueue是一個(gè)無界的BlockingQueue,用于放置實(shí)現(xiàn)了Delayed接口的對象,其中的對象只能在其到期時(shí)才能從隊(duì)列中取走。

基于延遲隊(duì)列,是可以實(shí)現(xiàn)訂單的延遲關(guān)閉的,首先,在用戶創(chuàng)建訂單的時(shí)候,把訂單加入到DelayQueue中,然后,還需要一個(gè)常駐任務(wù)不斷的從隊(duì)列中取出那些到了超時(shí)時(shí)間的訂單,然后在把他們進(jìn)行關(guān)單,之后再從隊(duì)列中刪除掉。

這個(gè)方案需要有一個(gè)線程,不斷的從隊(duì)列中取出需要關(guān)單的訂單。一般在這個(gè)線程中需要加一個(gè)while(true)循環(huán),這樣才能確保任務(wù)不斷的執(zhí)行并且能夠及時(shí)的取出超時(shí)訂單。

使用DelayQueue實(shí)現(xiàn)超時(shí)關(guān)單的方案,實(shí)現(xiàn)起來簡單,必須要依賴第三方的框架和類庫,JDK原生就支持了。

當(dāng)然這個(gè)方案也不是沒有缺點(diǎn)的,首先,基于DelayQueue的話,需要把訂單放進(jìn)去,那如果訂單量太大的話,可能會導(dǎo)致OOM的問題;另外,DelayQueue是基于JVM內(nèi)存的,一旦機(jī)器重啟了,里面的數(shù)據(jù)就都沒有了。雖然我們可以配合數(shù)據(jù)庫的持久化一起使用。而且現(xiàn)在很多應(yīng)用都是集群部署的,那么集群中多個(gè)實(shí)例上的多個(gè)DelayQueue如何配合是一個(gè)很大的問題。

所以,基于JDK的DelayQueue方案只適合在單機(jī)場景、并且數(shù)據(jù)量不大的場景中使用,如果涉及到分布式場景,那還是不建議使用。

四、Netty的時(shí)間輪

還有一種方式,和上面我們提到的JDK自帶的DelayQueue類似的方式,那就是基于時(shí)間輪實(shí)現(xiàn)。

為什么要有時(shí)間輪呢?主要是因?yàn)镈elayQueue插入和刪除操作的平均時(shí)間復(fù)雜度——O(nlog(n)),雖然已經(jīng)挺好的了,但是時(shí)間輪的方案可以將插入和刪除操作的時(shí)間復(fù)雜度都降為O(1)。

時(shí)間輪可以理解為一種環(huán)形結(jié)構(gòu),像鐘表一樣被分為多個(gè) slot。每個(gè) slot 代表一個(gè)時(shí)間段,每個(gè) slot 中可以存放多個(gè)任務(wù),使用的是鏈表結(jié)構(gòu)保存該時(shí)間段到期的所有任務(wù)。時(shí)間輪通過一個(gè)時(shí)針隨著時(shí)間一個(gè)個(gè) slot 轉(zhuǎn)動(dòng),并執(zhí)行 slot 中的所有到期任務(wù)。

圖片

基于Netty的HashedWheelTimer可以幫助我們快速的實(shí)現(xiàn)一個(gè)時(shí)間輪,這種方式和DelayQueue類似,缺點(diǎn)都是基于內(nèi)存、集群擴(kuò)展麻煩、內(nèi)存有限制等等。

但是他相比DelayQueue的話,效率更高一些,任務(wù)觸發(fā)的延遲更低。代碼實(shí)現(xiàn)上面也更加精簡。

所以,基于Netty的時(shí)間輪方案比基于JDK的DelayQueue效率更高,實(shí)現(xiàn)起來更簡單,但是同樣的,只適合在單機(jī)場景、并且數(shù)據(jù)量不大的場景中使用,如果涉及到分布式場景,那還是不建議使用。

五、Kafka的時(shí)間輪

既然基于Netty的時(shí)間輪存在一些問題,那么有沒有其他的時(shí)間輪的實(shí)現(xiàn)呢?

還真有的,那就是Kafka的時(shí)間輪,Kafka內(nèi)部有很多延時(shí)性的操作,如延時(shí)生產(chǎn),延時(shí)拉取,延時(shí)數(shù)據(jù)刪除等,這些延時(shí)功能由內(nèi)部的延時(shí)操作管理器來做專門的處理,其底層是采用時(shí)間輪實(shí)現(xiàn)的。

而且,為了解決有一些時(shí)間跨度大的延時(shí)任務(wù),Kafka 還引入了層級時(shí)間輪,能更好控制時(shí)間粒度,可以應(yīng)對更加復(fù)雜的定時(shí)任務(wù)處理場景;

Kafka 中的時(shí)間輪的實(shí)現(xiàn)是 TimingWheel 類,位于 kafka.utils.timer 包中。基于Kafka的時(shí)間輪同樣可以得到O(1)時(shí)間復(fù)雜度,性能上還是不錯(cuò)的。

基于Kafka的時(shí)間輪的實(shí)現(xiàn)方式,在實(shí)現(xiàn)方式上有點(diǎn)復(fù)雜,需要依賴kafka,但是他的穩(wěn)定性和性能都要更高一些,而且適合用在分布式場景中。

六、RocketMQ延遲消息

相比于Kafka來說,RocketMQ中有一個(gè)強(qiáng)大的功能,那就是支持延遲消息。

延遲消息,當(dāng)消息寫入到Broker后,不會立刻被消費(fèi)者消費(fèi),需要等待指定的時(shí)長后才可被消費(fèi)處理的消息,稱為延時(shí)消息。

有了延遲消息,我們就可以在訂單創(chuàng)建好之后,發(fā)送一個(gè)延遲消息,比如20分鐘取消訂單,那就發(fā)一個(gè)延遲20分鐘的延遲消息,然后在20分鐘之后,消息就會被消費(fèi)者消費(fèi),消費(fèi)者在接收到消息之后,去關(guān)單就行了。

但是,RocketMQ的延遲消息并不是支持任意時(shí)長的延遲的,它只支持:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h這幾個(gè)時(shí)長。(商業(yè)版支持任意時(shí)長)

可以看到,有了RocketMQ延遲消息之后,我們處理上就簡單很多,只需要發(fā)消息,和接收消息就行了,系統(tǒng)之間完全解耦了。但是因?yàn)檠舆t消息的時(shí)長受到了限制,所以并不是很靈活。

如果我們的業(yè)務(wù)上,關(guān)單時(shí)長剛好和RocketMQ延遲消息支持的時(shí)長匹配的話,那么是可以基于RocketMQ延遲消息來實(shí)現(xiàn)的。否則,這種方式并不是最佳的。

七、RabbitMQ死信隊(duì)列

延遲消息不僅在RocketMQ中支持,其實(shí)在RabbitMQ中也是可以實(shí)現(xiàn)的,只不過其底層是基于死信隊(duì)列實(shí)現(xiàn)的。

當(dāng)RabbitMQ中的一條正常的消息,因?yàn)檫^了存活時(shí)間(TTL過期)、隊(duì)列長度超限、被消費(fèi)者拒絕等原因無法被消費(fèi)時(shí),就會變成Dead Message,即死信。

當(dāng)一個(gè)消息變成死信之后,他就能被重新發(fā)送到死信隊(duì)列中(其實(shí)是交換機(jī)-exchange)。

那么基于這樣的機(jī)制,就可以實(shí)現(xiàn)延遲消息了。那就是我們給一個(gè)消息設(shè)定TTL,然但是并不消費(fèi)這個(gè)消息,等他過期,過期后就會進(jìn)入到死信隊(duì)列,然后我們再監(jiān)聽死信隊(duì)列的消息消費(fèi)就行了。

而且,RabbitMQ中的這個(gè)TTL是可以設(shè)置任意時(shí)長的,這就解決了RocketMQ的不靈活的問題。

但是,死信隊(duì)列的實(shí)現(xiàn)方式存在一個(gè)問題,那就是可能造成隊(duì)頭阻塞,因?yàn)殛?duì)列是先進(jìn)先出的,而且每次只會判斷隊(duì)頭的消息是否過期,那么,如果隊(duì)頭的消息時(shí)間很長,一直都不過期,那么就會阻塞整個(gè)隊(duì)列,這時(shí)候即使排在他后面的消息過期了,那么也會被一直阻塞。

基于RabbitMQ的死信隊(duì)列,可以實(shí)現(xiàn)延遲消息,非常靈活的實(shí)現(xiàn)定時(shí)關(guān)單,并且借助RabbitMQ的集群擴(kuò)展性,可以實(shí)現(xiàn)高可用,以及處理大并發(fā)量。他的缺點(diǎn)第一是可能存在消息阻塞的問題,還有就是方案比較復(fù)雜,不僅要依賴RabbitMQ,而且還需要聲明很多隊(duì)列(exchange)出來,增加系統(tǒng)的復(fù)雜度

八、RabbitMQ插件

其實(shí),基于RabbitMQ的話,可以不用死信隊(duì)列也能實(shí)現(xiàn)延遲消息,那就是基于rabbitmq_delayed_message_exchange插件,這種方案能夠解決通過死信隊(duì)列實(shí)現(xiàn)延遲消息出現(xiàn)的消息阻塞問題。但是該插件從RabbitMQ的3.6.12開始支持的,所以對版本有要求。

圖片

這個(gè)插件是官方出的,可以放心使用,安裝并啟用這個(gè)插件之后,就可以創(chuàng)建x-delayed-message類型的隊(duì)列了。

前面我們提到的基于私信隊(duì)列的方式,是消息先會投遞到一個(gè)正常隊(duì)列,在TTL過期后進(jìn)入死信隊(duì)列。但是基于插件的這種方式,消息并不會立即進(jìn)入隊(duì)列,而是先把他們保存在一個(gè)基于Erlang開發(fā)的Mnesia數(shù)據(jù)庫中,然后通過一個(gè)定時(shí)器去查詢需要被投遞的消息,再把他們投遞到x-delayed-message隊(duì)列中。

基于RabbitMQ插件的方式可以實(shí)現(xiàn)延遲消息,并且不存在消息阻塞的問題,但是因?yàn)槭腔诓寮模@個(gè)插件支持的最大延長時(shí)間是(2^32)-1 毫秒,大約49天,超過這個(gè)時(shí)間就會被立即消費(fèi)。但是他基于RabbitMQ實(shí)現(xiàn),所以在可用性、性能方便都很不錯(cuò)

九、Redis過期監(jiān)聽

很多用過Redis的人都知道,Redis有一個(gè)過期監(jiān)聽的功能,

在 redis.conf 中,加入一條配置notify-keyspace-events Ex開啟過期監(jiān)聽,然后再代碼中實(shí)現(xiàn)一個(gè)KeyExpirationEventMessageListener,就可以監(jiān)聽key的過期消息了。

這樣就可以在接收到過期消息的時(shí)候,進(jìn)行訂單的關(guān)單操作。

這個(gè)方案不建議大家使用,是因?yàn)镽edis官網(wǎng)上明確的說過,Redis并不保證Key在過期的時(shí)候就能被立即刪除,更不保證這個(gè)消息能被立即發(fā)出。所以,消息延遲是必然存在的,隨著數(shù)據(jù)量越大延遲越長,延遲個(gè)幾分鐘都是常事兒。?

而且,在Redis 5.0之前,這個(gè)消息是通過PUB/SUB模式發(fā)出的,他不會做持久化,至于你有沒有接到,有沒有消費(fèi)成功,他不管。也就是說,如果發(fā)消息的時(shí)候,你的客戶端掛了,之后再恢復(fù)的話,這個(gè)消息你就徹底丟失了。(在Redis 5.0之后,因?yàn)橐肓薙tream,是可以用來做延遲消息隊(duì)列的。)

十、Redis的zset

雖然基于Redis過期監(jiān)聽的方案并不完美,但是并不是Redis實(shí)現(xiàn)關(guān)單功能就不完美了,還有其他的方案。

我們可以借助Redis中的有序集合——zset來實(shí)現(xiàn)這個(gè)功能。

zset是一個(gè)有序集合,每一個(gè)元素(member)都關(guān)聯(lián)了一個(gè) score,可以通過 score 排序來取集合中的值。

我們將訂單超時(shí)時(shí)間的時(shí)間戳(下單時(shí)間+超時(shí)時(shí)長)與訂單號分別設(shè)置為 score 和 member。這樣redis會對zset按照score延時(shí)時(shí)間進(jìn)行排序。然后我們再開啟redis掃描任務(wù),獲取”當(dāng)前時(shí)間 > score”的延時(shí)任務(wù),掃描到之后取出訂單號,然后查詢到訂單進(jìn)行關(guān)單操作即可。

使用redis zset來實(shí)現(xiàn)訂單關(guān)閉的功能的優(yōu)點(diǎn)是可以借助redis的持久化、高可用機(jī)制。避免數(shù)據(jù)丟失。但是這個(gè)方案也有缺點(diǎn),那就是在高并發(fā)場景中,有可能有多個(gè)消費(fèi)者同時(shí)獲取到同一個(gè)訂單號,一般采用加分布式鎖解決,但是這樣做也會降低吞吐型。?

但是,在大多數(shù)業(yè)務(wù)場景下,如果冪等性做得好的,多個(gè)消費(fèi)者取到同一個(gè)訂單號也無妨。

十一、Redisson

上面這種方案看上去還不錯(cuò),但是需要我們自己基于zset這種數(shù)據(jù)結(jié)構(gòu)編寫代碼,那么有沒有什么更加友好的方式?

有的,那就是基于Redisson。

Redisson是一個(gè)在Redis的基礎(chǔ)上實(shí)現(xiàn)的框架,它不僅提供了一系列的分布式的Java常用對象,還提供了許多分布式服務(wù)。

圖片

Redission中定義了分布式延遲隊(duì)列RDelayedQueue,這是一種基于我們前面介紹過的zset結(jié)構(gòu)實(shí)現(xiàn)的延時(shí)隊(duì)列,它允許以指定的延遲時(shí)長將元素放到目標(biāo)隊(duì)列中。

其實(shí)就是在zset的基礎(chǔ)上增加了一個(gè)基于內(nèi)存的延遲隊(duì)列。當(dāng)我們要添加一個(gè)數(shù)據(jù)到延遲隊(duì)列的時(shí)候,redission會把數(shù)據(jù)+超時(shí)時(shí)間放到zset中,并且起一個(gè)延時(shí)任務(wù),當(dāng)任務(wù)到期的時(shí)候,再去zset中把數(shù)據(jù)取出來,返回給客戶端使用。

大致思路就是這樣的,感興趣的大家可以看一看RDelayedQueue的具體實(shí)現(xiàn)。

基于Redisson的實(shí)現(xiàn)方式,是可以解決基于zset方案中的并發(fā)重復(fù)問題的,而且還能實(shí)現(xiàn)方式也比較簡單,穩(wěn)定性、性能都比較高。

總結(jié)

我們介紹了11種實(shí)現(xiàn)訂單定時(shí)關(guān)閉的方案,其中不同的方案各自都有優(yōu)缺點(diǎn),也各自適用于不同的場景中。那我們嘗試著總結(jié)一下:

實(shí)現(xiàn)的復(fù)雜度上(包含用到的框架的依賴及部署):?

Redission > RabbitMQ插件 > RabbitMQ死信隊(duì)列 > RocketMQ延遲消息 ≈ Redis的zset > Redis過期監(jiān)聽 ≈ kafka時(shí)間輪 > 定時(shí)任務(wù) > Netty的時(shí)間輪 > JDK自帶的DelayQueue > 被動(dòng)關(guān)閉

方案的完整性:?

Redission ≈ RabbitMQ插件 > kafka時(shí)間輪 > Redis的zset ≈ RocketMQ延遲消息 ≈ RabbitMQ死信隊(duì)列 > Redis過期監(jiān)聽 > 定時(shí)任務(wù) > Netty的時(shí)間輪 > JDK自帶的DelayQueue > 被動(dòng)關(guān)閉

不同的場景中也適合不同的方案:?

  • 自己玩玩:被動(dòng)關(guān)閉
  • 單體應(yīng)用,業(yè)務(wù)量不大:Netty的時(shí)間輪、JDK自帶的DelayQueue、定時(shí)任務(wù)
  • 分布式應(yīng)用,業(yè)務(wù)量不大:Redis過期監(jiān)聽、RabbitMQ死信隊(duì)列、Redis的zset、定時(shí)任務(wù)
  • 分布式應(yīng)用,業(yè)務(wù)量大、并發(fā)高:Redission、RabbitMQ插件、kafka時(shí)間輪、RocketMQ延遲消息

總體考慮的話,考慮到成本,方案完整性、以及方案的復(fù)雜度,還有用到的第三方框架的流行度來說,個(gè)人比較建議優(yōu)先考慮Redission+Redis、RabbitMQ插件、Redis的zset、RocketMQ延遲消息等方案。?

責(zé)任編輯:武曉燕 來源: Hollis
相關(guān)推薦

2018-08-07 16:01:32

synchronizevolatilefinal

2022-09-26 10:09:08

MVCC控制并發(fā)

2020-12-11 08:23:06

JavaMemory Mode內(nèi)存模型

2018-07-03 14:54:25

Java內(nèi)存模型

2018-12-07 09:31:52

分布式鎖服務(wù)框架分布式系統(tǒng)

2021-02-22 13:32:19

MySQLSQL索引

2021-05-31 09:42:48

MySQL隔離級別

2022-05-23 09:41:27

分庫分表數(shù)據(jù)庫算法

2019-11-04 15:00:50

MySQL索引B+樹

2021-03-08 12:47:42

MySQL查詢數(shù)據(jù)

2019-11-05 14:06:07

MySQLB+索引

2021-03-08 10:25:37

MySQL數(shù)據(jù)庫索引

2022-10-21 16:39:56

JDK優(yōu)化

2023-12-11 08:32:58

數(shù)據(jù)庫DruidDBA

2020-04-20 13:11:21

HashMap底層存儲

2020-04-28 09:15:58

HashMapJava數(shù)組

2019-09-19 14:03:32

B樹節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)

2019-12-10 09:08:29

分布式開源RocketMQ

2018-04-13 16:24:59

區(qū)塊鏈數(shù)據(jù)庫去中心化

2019-04-15 14:40:46

消息隊(duì)列Java編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲精品一区二三区不卡| 午夜成人免费电影| 91久久精品一区二区别| 亚洲欧美在线观看视频| 国产欧美一区二区精品久久久| 色婷婷av一区二区三区软件| 欧美激情伊人电影| 国产69视频在线观看| 神马电影网我不卡| 亚洲精品欧美在线| 欧美最大成人综合网| av免费观看在线| 国产色综合网| 欧美另类99xxxxx| 精品人妻无码一区二区三区 | 综合久久综合久久| 国内不卡一区二区三区| 国产强伦人妻毛片| 日韩高清一级片| 欧美激情视频免费观看| 国产午夜精品久久久久久久久| 超碰97成人| 欧美日韩国产系列| 成人在线观看黄| 精灵使的剑舞无删减版在线观看| 欧美国产日韩一二三区| 久久天堂国产精品| 性色av蜜臀av| 激情综合色播激情啊| 日韩av免费看| 日韩不卡在线播放| 亚洲激情另类| 欧美高清视频一区二区| 三级在线观看免费大全| 日本一区二区在线看| 亚洲美女www午夜| 国产精品一级黄片| 国产 日韩 欧美 综合 一区| 日韩一区二区三区免费看| 久热精品在线播放| 日本精品另类| 在线免费视频一区二区| 男女高潮又爽又黄又无遮挡| 大桥未久在线视频| 亚洲综合视频在线观看| 亚洲中文字幕无码一区二区三区| 毛片免费不卡| 日韩美女啊v在线免费观看| 日产中文字幕在线精品一区| 日韩欧美电影在线观看| 2021中文字幕一区亚洲| 欧美不卡福利| 国产三级视频在线看| 久久久99久久| 天堂社区 天堂综合网 天堂资源最新版 | 国产调教视频在线观看| 中文字幕一区二| 妞干网这里只有精品| a级毛片免费观看在线| 亚洲精品久久嫩草网站秘色| 波多野结衣av一区二区全免费观看| 亚洲第一图区| 香蕉久久一区二区不卡无毒影院 | 亚洲成人久久久| 男男一级淫片免费播放| 亚洲都市激情| 一区二区三区四区在线观看视频| 欧美日韩生活片| 亚州av乱码久久精品蜜桃 | 欧美日韩免费一区二区| 欧美午夜在线视频| 91av在线网站| 日韩欧美一级大片| 国产一区二区视频在线| 国产成人av一区二区三区| 天天操天天操天天| 国产日韩亚洲欧美综合| 在线观看一区二区三区三州| 3d玉蒲团在线观看| 婷婷综合在线观看| 蜜臀av免费观看| 午夜精品在线| 亚洲男人天堂2023| 日本午夜在线观看| 亚洲乱码视频| 国产精品永久免费| 亚洲精品一级片| 久久精品日韩一区二区三区| 中文字幕一区二区三区乱码| heyzo高清在线| 欧美午夜理伦三级在线观看| 精品人妻一区二区三| 日本国产精品| 久久亚洲私人国产精品va| 日本高清www免费视频| 免费在线观看视频一区| 国产二区不卡| 日本在线观看| 午夜精品视频一区| 久久久久久久久久一区| 欧美自拍一区| 欧美国产日韩一区二区| 狠狠狠狠狠狠狠| 国产馆精品极品| 日本公妇乱淫免费视频一区三区| 日韩影视在线| 欧美视频第二页| 美女又爽又黄免费| 午夜精品一区二区三区国产 | 国产午夜性春猛交ⅹxxx| 久久精品72免费观看| 国产精品一区在线播放| 黄色网页在线看| 欧洲一区二区三区免费视频| 亚洲成年人在线观看| 欧美激情成人| 国产成人精品日本亚洲| 日本高清视频免费看| 亚洲欧洲国产日韩| 亚洲狼人综合干| 欧美大片网址| 国内精品久久久久| 国产成a人亚洲精v品无码 | 亚洲欧美日韩另类精品一区二区三区 | 日韩1区在线| 国产精品99久久久久久久久| 色欲av永久无码精品无码蜜桃| 亚洲精品欧美在线| www.se五月| 成人中文视频| 国产91在线播放九色快色| 少妇精品视频一区二区| 一区二区三区色| 手机在线观看日韩av| 国产精品成人一区二区不卡| 国产精品毛片a∨一区二区三区|国| 午夜在线视频免费| 亚洲第一综合色| 欧美做受高潮中文字幕| 欧美日韩中文| 成人资源视频网站免费| 青青草原av在线| 日韩一二三四区| 青青草激情视频| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩av资源在线| 色88888久久久久久影院| 97香蕉超级碰碰久久免费软件| 免费av一级片| 五月婷婷色综合| asian性开放少妇pics| 亚洲一区区二区| 欧洲精品国产| 精品自拍视频| 日韩在线观看成人| 国产精品久久久久精| 亚洲丝袜美腿综合| 欧美69精品久久久久久不卡| 国产尤物精品| 久久精品日产第一区二区三区精品版| 欧美巨大丰满猛性社交| 亚洲欧美日韩一区二区三区在线| 亚洲黄网在线观看| 国产日韩欧美高清| 午夜不卡福利视频| 亚洲一级毛片| 国产精品乱子乱xxxx| 麻豆蜜桃在线观看| 国产亚洲精品久久久久久牛牛 | 久久99精品久久久久久动态图| 中文字幕欧美日韩一区二区| 日韩在线亚洲| 4k岛国日韩精品**专区| av一本在线| 日韩视频在线一区二区| 成人毛片18女人毛片| 久久精品一区蜜桃臀影院| 天天综合网久久| 激情自拍一区| 青娱乐一区二区| 久久久久久久久成人| 午夜精品一区二区三区在线视 | 蜜月aⅴ免费一区二区三区| 亚洲国产精品成人久久蜜臀| 欧美性xxxxhd| 91 在线视频| 91美女片黄在线| 欧美视频国产视频| 亚洲深夜激情| 在线国产精品网| 亚洲精品国产动漫| 91成人伦理在线电影| 韩国美女久久| 美女精品视频一区| 狠狠色伊人亚洲综合网站l| 欧美一区二区在线视频| 在线观看日本网站| 一区二区三区在线免费| 色欲AV无码精品一区二区久久| 国产成人日日夜夜| 亚洲欧美在线精品| 99riav1国产精品视频| 中文字幕综合在线观看| 国产精品白浆| 成人夜晚看av| 欧美va在线| 高清一区二区三区四区五区| 丝袜美腿美女被狂躁在线观看 | 97超碰国产一区二区三区| 精品国产百合女同互慰| 一级黄色片在线播放| 欧美视频在线看| 久久久久久久久久综合| 国产精品欧美一区喷水| 国产成人av一区二区三区不卡| 国产成人亚洲精品狼色在线 | 成人免费看视频| 天天看片天天操| 日韩不卡一区二区| 亚洲中文字幕无码专区| 尤物精品在线| 成人在线播放网址| 欧美二区视频| 亚洲天堂第一区| 91亚洲人成网污www| 色播亚洲视频在线观看| 久久99视频| 久久99精品久久久久久青青日本| 911精品国产| 电影午夜精品一区二区三区| 欧美日韩中出| 亚洲xxx视频| 亚洲精品一二三**| 2019国产精品视频| www.久久久.com| 成人av番号网| 国产精品va视频| 91免费版网站入口| 国产成人免费av一区二区午夜| 国产欧美日韩91| 日本久久久久| 成人激情视频在线播放| 婷婷久久综合九色综合99蜜桃| 国产精品视频1区| 欧美黄页免费| 成人日韩av在线| 精品亚洲二区| 97人人干人人| 9l视频自拍九色9l视频成人| 国产精品亚洲综合| 看全色黄大色大片免费久久久| 精品欧美国产一区二区三区不卡| 欧美激情影院| 欧美一区二区高清在线观看| 精品九九在线| 国产精品99久久久久久大便| 先锋资源久久| 欧美乱大交xxxxx潮喷l头像| 亚洲日本久久| 成人综合视频在线| 青青国产91久久久久久| 成人亚洲免费视频| 国产精品一区不卡| 大乳护士喂奶hd| 久久色在线观看| 国产大屁股喷水视频在线观看| 国产精品情趣视频| 久草免费新视频| 好吊成人免视频| 中文字幕乱码一区二区| 91精品综合久久久久久| 蜜臀av午夜精品| 亚洲最新在线视频| av免费在线免费| 51精品国产黑色丝袜高跟鞋| 日韩精品麻豆| 91亚洲精品丁香在线观看| 亚洲电影男人天堂| 国产高清精品软男同| 亚洲激情视频| 成人综合久久网| 成人av在线网| 精品视频第一页| 亚洲午夜电影在线观看| 不卡av电影在线| 日韩欧美中文字幕精品| 你懂的视频在线免费| 久久伊人精品视频| 桃花岛成人影院| 91九色极品视频| 精品国产一区二区三区小蝌蚪| 300部国产真实乱| 久久久水蜜桃av免费网站| 在线视频一二区| 国产视频在线观看一区二区三区| 青娱乐免费在线视频| 91福利国产成人精品照片| 国产高清免费观看| 在线成人激情黄色| 擼擼色在线看观看免费| 91影院在线免费观看视频| 中日韩免视频上线全都免费| 玖玖精品在线视频| 日韩电影在线免费观看| 亚洲男女在线观看| 亚洲精选视频在线| 中文在线资源天堂| 亚洲精品国产品国语在线| 91一区二区三区在线| 国产精品久久久久久av| 免费萌白酱国产一区二区三区| 色爽爽爽爽爽爽爽爽| 日韩国产在线一| 好吊一区二区三区视频| 一区二区免费在线| 国产精品福利电影| 中文字幕亚洲激情| 天天免费亚洲黑人免费| 国产在线精品一区二区三区》| 伊人久久大香线蕉精品组织观看| youjizzxxxx18| 久久伊人蜜桃av一区二区| 精品无码久久久久| 日韩色在线观看| 爆操欧美美女| 成人午夜激情免费视频| 人人狠狠综合久久亚洲婷| 成人黄色av片| 成人免费va视频| 国产精品7777| 精品国一区二区三区| a毛片在线观看| 亚洲一区久久久| 婷婷综合在线| 在线免费看污网站| 日韩毛片一二三区| 国产又粗又猛又黄又爽| 日韩在线观看免费高清完整版| 成人性生活av| 欧美18视频| 久久一区欧美| 国产aⅴ激情无码久久久无码| 一本色道a无线码一区v| 免费理论片在线观看播放老| 国产激情视频一区| 日韩成人精品一区| 亚洲xxx在线观看| 亚洲天堂a在线| 亚洲伦理在线观看| 久久免费视频在线观看| 精品国产一区二区三区成人影院 | 日本道在线视频| 国产成人午夜99999| 国产极品在线播放| 亚洲经典中文字幕| 美女100%一区| 手机看片福利永久国产日韩| 久久福利视频一区二区| 在线免费日韩av| 亚洲国产精品一区二区久| 亚洲美女久久精品| 图片区小说区区亚洲五月| 久久国产三级精品| 免费在线视频一区二区| 亚洲精品国产美女| 亚洲欧美在线成人| 精品嫩模一区二区三区| 成人aa视频在线观看| 在线精品免费视| 久久精品国产成人精品| xxxxxhd亚洲人hd| 日本成人黄色网| 日韩久久一区二区| 日本精品久久久久| 国产精品高潮呻吟久久av无限 | 中文字幕二三区不卡| 国产精品毛片久久久久久久av | 日韩久久精品视频| 一区二区日韩精品| 一区二区三区欧洲区| av网站在线观看不卡| 中文字幕五月欧美| 天天综合网在线观看| 国产精品视频午夜| 伊人久久婷婷| 懂色av蜜臀av粉嫩av永久| 精品国精品自拍自在线| 国产精品字幕| 国产va亚洲va在线va| 中文在线一区二区| 亚洲AV午夜精品| 国产精品一区二区三区成人| 国内精品久久久久久久97牛牛| 国产综合精品在线| 日韩精品影音先锋| 自拍偷自拍亚洲精品被多人伦好爽| 精品91一区二区三区| 久久久午夜电影| www.黄色av| 国产欧美日韩综合精品|