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

構建高性能內存隊列:Disruptor yyds~

開發 架構
? Disruptor它是一個開源的并發框架,并獲得2011 Duke’s程序框架創新獎【Oracle】,能夠在無鎖的情況下實現網絡的Queue并發操作。英國外匯交易公司LMAX開發的一個高性能隊列,號稱單線程能支撐每秒600萬訂單。

Java中有哪些隊列

  • ArrayBlockingQueue 使用ReentrantLock
  • LinkedBlockingQueue 使用ReentrantLock
  • ConcurrentLinkedQueue 使用CAS
  • 等等

我們清楚使用鎖的性能比較低,盡量使用無鎖設計。接下來就我們來認識下Disruptor。

Disruptor簡單使用

github地址:https://github.com/LMAX-Exchange/disruptor/wiki/Performance-Results

先簡單介紹下:

  • Disruptor它是一個開源的并發框架,并獲得2011 Duke’s程序框架創新獎【Oracle】,能夠在無鎖的情況下實現網絡的Queue并發操作。英國外匯交易公司LMAX開發的一個高性能隊列,號稱單線程能支撐每秒600萬訂單~
  • 日志框架Log4j2 異步模式采用了Disruptor來處理
  • 局限呢,他就是個內存隊列,也就是說無法支撐分布式場景。

圖片

圖片

簡單使用

數據傳輸對象

@Data
public class EventData {
private Long value;
}

消費者

public class EventConsumer implements WorkHandler<EventData> {

/**
* 消費回調
* @param eventData
* @throws Exception
*/
@Override
public void onEvent(EventData eventData) throws Exception {
Thread.sleep(5000);
System.out.println(Thread.currentThread() + ", eventData:" + eventData.getValue());
}
}

生產者

public class EventProducer {

private final RingBuffer<EventData> ringBuffer;

public EventProducer(RingBuffer<EventData> ringBuffer) {
this.ringBuffer = ringBuffer;
}

public void sendData(Long v){
// cas展位
long next = ringBuffer.next();
try {
EventData eventData = ringBuffer.get(next);
eventData.setValue(v);
} finally {
// 通知等待的消費者
System.out.println("EventProducer send success, sequence:"+next);
ringBuffer.publish(next);
}
}
}

測試類

public class DisruptorTest {

public static void main(String[] args) {
// 2的n次方
int bufferSize = 8;

Disruptor<EventData> disruptor = new Disruptor<EventData>(
() -> new EventData(), // 事件工廠
bufferSize, // 環形數組大小
Executors.defaultThreadFactory(), // 線程池工廠
ProducerType.MULTI, // 支持多事件發布者
new BlockingWaitStrategy()); // 等待策略

// 設置消費者
disruptor.handleEventsWithWorkerPool(
new EventConsumer(),
new EventConsumer(),
new EventConsumer(),
new EventConsumer());

disruptor.start();

RingBuffer<EventData> ringBuffer = disruptor.getRingBuffer();
EventProducer eventProducer = new EventProducer(ringBuffer);
long i = 0;
for(;;){
i++;
eventProducer.sendData(i);
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}

核心組件

基于上面簡單例子來看確實很簡單,Disruptor幫我們封裝好了生產消費模型的實現,接下來我們來看下他是基于哪些核心組件來支撐起一個高性能無鎖隊列呢?

RingBuffer: 環形數組,底層使用數組entries,在初始化時填充數組,避免不斷新建對象帶來的開銷。后續只會對entries做更新操作

圖片

圖片

圖片

Sequencer: 核心管家

  • 定義生產同步的實現:SingleProducerSequencer?單生產、MultiProducerSequencer多生產
  • 當前寫的進度Sequence cursor
  • 所有消費者進度的數組Sequence[] gatingSequences
  • MultiProducerSequencer?可用區availableBuffer【利用空間換取查詢效率】

Sequence: 本身就是一個序號器用來標識處理進度,也可以當做是一個atomicInteger; 還有另外一個特點,為了解決偽共享問題而引入的:緩存行填充。這個在后面介紹。

workProcessor: 處理Event的循環,在循環中獲取Disruptor的事件,然后把事件分配給各個handler

EventHandler: 負責業務邏輯的handler,自己實現。

WaitStrategy: 消費者 如何等待 事件的策略,定義了如下策略

  • leepingWaitStrategy:自旋 + yield + sleep
  • BlockingWaitStrategy:加鎖,適合CPU資源緊張(不需要切換線程),系統吞吐量無要求的
  • YieldingWaitStrategy:自旋 + yield + 自旋
  • BusySpinWaitStrategy:自旋,減少線程之前切換
  • PhasedBackoffWaitStrategy:自旋 + yield + 自定義策略

帶著問題來解析代碼?

1、多生產者如何保證消息生產不會相互覆蓋?!救绾芜_到互斥效果】

圖片

每個線程獲取不同的一段數組空間,然后通過CAS判斷這段空間是否已經分配出去。

接下來我們看下多生產類MultiProducerSequencer中next方法【獲取生產序號】

// 消費者上一次消費的最小序號 // 后續第二點會講到
private final Sequence gatingSequenceCache = new Sequence(Sequencer.INITIAL_CURSOR_VALUE);
// 當前進度的序號
protected final Sequence cursor = new Sequence(Sequencer.INITIAL_CURSOR_VALUE);
// 所有消費者的序號 //后續第二點會講到
protected volatile Sequence[] gatingSequences = new Sequence[0];

public long next(int n)
{
if (n < 1)
{
throw new IllegalArgumentException("n must be > 0");
}
long current;
long next;
do
{
// 當前進度的序號,Sequence的value具有可見性,保證多線程間線程之間能感知到可申請的最新值
current = cursor.get();
// 要申請的序號空間:最大序列號
next = current + n;

long wrapPoint = next - bufferSize;
// 消費者最小序列號
long cachedGatingSequence = gatingSequenceCache.get();
// 大于一圈 || 最小消費序列號>當前進度
if (wrapPoint > cachedGatingSequence || cachedGatingSequence > current)
{
long gatingSequence = Util.getMinimumSequence(gatingSequences, current);
// 說明大于1圈,并沒有多余空間可以申請
if (wrapPoint > gatingSequence)
{
LockSupport.parkNanos(1); // TODO, should we spin based on the wait strategy?
continue;
}
// 更新最小值到Sequence的value中
gatingSequenceCache.set(gatingSequence);
}
// CAS成功后更新當前Sequence的value
else if (cursor.compareAndSet(current, next))
{
break;
}
}
while (true);
return next;
}

2、生產者向序號器申請寫的序號,如序號正在被消費,Sequencer是如何知道哪些序號是可以被寫入的呢?【未消費則被覆蓋如何處理】

從gatingSequences中取得最小的序號,生產者最多能寫到這個序號的后一位。通俗來講就是申請的序號不能大于最小消費者序號一圈【申請到最大序列號-buffersize 要小于/等于 最小消費的序列號】的時候, 才能申請到當前寫的序號

圖片

public final EventHandlerGroup<T> handleEventsWithWorkerPool(final WorkHandler<T>... workHandlers)
{
return createWorkerPool(new Sequence[0], workHandlers);
}


EventHandlerGroup<T> createWorkerPool(
final Sequence[] barrierSequences, final WorkHandler<? super T>[] workHandlers)
{
final SequenceBarrier sequenceBarrier = ringBuffer.newBarrier(barrierSequences);
final WorkerPool<T> workerPool = new WorkerPool<>(ringBuffer, sequenceBarrier, exceptionHandler, workHandlers);


consumerRepository.add(workerPool, sequenceBarrier);

final Sequence[] workerSequences = workerPool.getWorkerSequences();

updateGatingSequencesForNextInChain(barrierSequences, workerSequences);

return new EventHandlerGroup<>(this, consumerRepository, workerSequences);
}

private void updateGatingSequencesForNextInChain(final Sequence[] barrierSequences, final Sequence[] processorSequences)
{
if (processorSequences.length > 0)
{
// 消費者啟動后就會將所有消費者存放入AbstractSequencer中gatingSequences
ringBuffer.addGatingSequences(processorSequences);
for (final Sequence barrierSequence : barrierSequences)
{
ringBuffer.removeGatingSequence(barrierSequence);
}
consumerRepository.unMarkEventProcessorsAsEndOfChain(barrierSequences);
}
}

3、在多生產者情況下,生產者是申請到一段可寫入的序號,然后再寫入這些序號中,那么消費者是如何感知哪些序號是可以被消費的呢?【借問提1圖說明】

這個前提是多生產者情況下,第一點我們說過每個線程獲取不同的一段數組空間,那么現在單單通過序號已經不夠用了,MultiProducerSequencer?使用了int 數組 【availableBuffer?】來標識當前序號是否可用。當生產者成功生產事件后會將availableBuffer中當前序列號置為1標識可以讀取。

如此消費者可以讀取的的最大序號就是我們availableBuffer中第一個不可用序號-1。

圖片

初始化availableBuffer流程

public MultiProducerSequencer(int bufferSize, final WaitStrategy waitStrategy)
{
super(bufferSize, waitStrategy);
// 初始化可用數組
availableBuffer = new int[bufferSize];
indexMask = bufferSize - 1;
indexShift = Util.log2(bufferSize);
initialiseAvailableBuffer();
}
// 初始化默認availableBuffer為-1
private void initialiseAvailableBuffer()
{
for (int i = availableBuffer.length - 1; i != 0; i--)
{
setAvailableBufferValue(i, -1);
}

setAvailableBufferValue(0, -1);
}

// 生產者成功生產事件將可用區數組置為1
public void publish(final long sequence)
{
setAvailable(sequence);
waitStrategy.signalAllWhenBlocking();
}

private void setAvailableBufferValue(int index, int flag)
{
long bufferAddress = (index * SCALE) + BASE;
UNSAFE.putOrderedInt(availableBuffer, bufferAddress, flag);
}

消費者消費流程

WorkProcessor類中消費run方法
public void run()
{
boolean processedSequence = true;
long cachedAvailableSequence = Long.MIN_VALUE;
long nextSequence = sequence.get();
T event = null;
while (true)
{
try
{
// 先通過cas獲取消費事件的占有權
if (processedSequence)
{
processedSequence = false;
do
{
nextSequence = workSequence.get() + 1L;
sequence.set(nextSequence - 1L);
}
while (!workSequence.compareAndSet(nextSequence - 1L, nextSequence));
}
// 數據就緒,可以消費
if (cachedAvailableSequence >= nextSequence)
{
event = ringBuffer.get(nextSequence);
// 觸發回調函數
workHandler.onEvent(event);
processedSequence = true;
}
else
{
// 獲取可以被讀取的下標
cachedAvailableSequence = sequenceBarrier.waitFor(nextSequence);
}
}
// ....省略
}

notifyShutdown();

running.set(false);
}


public long waitFor(final long sequence)
throws AlertException, InterruptedException, TimeoutException
{
checkAlert();
// 這個值獲取的current write 下標,可以認為全局消費下標。此處與每一段的write1和write2下標區分開
long availableSequence = waitStrategy.waitFor(sequence, cursorSequence, dependentSequence, this);

if (availableSequence < sequence)
{
return availableSequence;
}
// 通過availableBuffer篩選出第一個不可用序號 -1
return sequencer.getHighestPublishedSequence(sequence, availableSequence);
}

public long getHighestPublishedSequence(long lowerBound, long availableSequence)
{
// 從current read下標開始, 循環至 current write,如果碰到availableBuffer 為-1 直接返回
for (long sequence = lowerBound; sequence <= availableSequence; sequence++)
{
if (!isAvailable(sequence))
{
return sequence - 1;
}
}

return availableSequence;
}

解決偽共享問題

什么是偽共享問題呢?

為了提高CPU的速度,Cpu有高速緩存Cache,該緩存最小單位為緩存行CacheLine,他是從主內存復制的Cache的最小單位,通常是64字節。一個Java的long類型是8字節,因此在一個緩存行中可以存8個long類型的變量。如果你訪問一個long數組,當數組中的一個值被加載到緩存中,它會額外加載另外7個。因此你能非??斓乇闅v這個數組。

偽共享問題是指,當多個線程共享某份數據時,線程1可能拉到線程2的數據在其cache line中,此時線程1修改數據,線程2取其數據時就要重新從內存中拉取,兩個線程互相影響,導致數據雖然在cache line中,每次卻要去內存中拉取。

圖片

Disruptor是如何解決的呢?

在value前后統一都加入7個Long類型進行填充,線程拉取時,不論如何都會占滿整個緩存

圖片

回顧總結:Disuptor為何能稱之為高性能的無鎖隊列框架呢?

  • 緩存行填充,避免緩存頻繁失效?!緅ava8中也引入@sun.misc.Contended注解來避免偽共享】
  • 無鎖競爭:通過CAS 【二階段提交】
  • 環形數組:數據都是覆蓋,避免GC
  • 底層更多的使用位運算來提升效率
責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2025-08-14 07:42:21

2022-06-09 08:36:56

高性能Disruptor模式

2017-07-11 15:26:57

LocalMQ RocketMQ高性能

2024-08-15 06:51:31

2024-10-30 15:43:56

2023-09-04 08:32:43

web開發圖像

2011-09-14 10:08:07

Beanstalkd

2024-07-31 08:31:13

2024-12-31 07:56:33

Disruptor內存有界隊列消費模式

2011-10-21 14:20:59

高性能計算HPC虛擬化

2011-10-25 13:13:35

HPC高性能計算Platform

2025-09-16 02:55:00

2025-01-15 07:54:02

2011-04-25 14:06:23

java

2011-04-07 09:25:25

內存Java

2011-12-15 13:28:57

2025-03-04 08:00:00

機器學習Rust開發

2020-06-05 07:20:41

測試自動化環境

2009-06-03 14:24:12

ibmdwWebSphere

2025-06-03 08:15:00

微服務架構異步任務隊列
點贊
收藏

51CTO技術棧公眾號

欧美男体视频| 国产人成在线视频| 欧美日本一区二区视频在线观看| 日韩欧美国产综合一区 | 手机免费看av| 亚洲精品555| 亚洲摸摸操操av| 久久久影院一区二区三区| 性高潮视频在线观看| 欧美日本三区| 自拍偷拍亚洲精品| 久久国产劲爆∧v内射| 成人不卡视频| 婷婷国产在线综合| 国产精品无码乱伦| 日韩精品系列| 国产精品一二三四| 日产精品久久久一区二区福利| 国产欧美一区二区三区在线观看视频| 日韩一区网站| 欧美日韩精品二区第二页| 和岳每晚弄的高潮嗷嗷叫视频| av在线之家电影网站| 成人国产精品视频| 国产在线观看精品一区二区三区| 国产主播在线播放| 天天插综合网| 中日韩美女免费视频网站在线观看| 伊人久久久久久久久| 国产精品黄色片| 欧美午夜视频在线观看| 日本国产中文字幕| 麻豆传媒在线免费看| 久久精品人人做人人爽97| 国产精品视频500部| 中文字幕日韩国产| 爽好久久久欧美精品| 午夜精品久久久久久久久久久久久| a一级免费视频| 成人情趣视频网站| 亚洲精品v天堂中文字幕| 三级网站免费看| 国产成人久久精品一区二区三区| 欧美性受xxxx| 三级在线免费看| 蜜桃精品在线| 色88888久久久久久影院野外| 日本人体一区二区| 91老司机福利在线| 夜夜爽夜夜爽精品视频| japanese在线播放| 日本a级在线| 成人欧美一区二区三区黑人麻豆| 亚洲激情啪啪| 视频三区在线| 国产精品国产三级国产aⅴ中文 | 亚洲最大黄网| 超碰91人人草人人干| 久久久久久久久久97| 亚洲情侣在线| 欧美人交a欧美精品| 草视频在线观看| 黄色成人在线网址| 久久久久久18| 天天爽夜夜爽夜夜爽精品| 亚洲视频播放| 国产精品成人免费电影| 亚洲精品国产欧美在线观看| 免费成人小视频| 国产精品美女在线观看| 91资源在线视频| 国产高清精品久久久久| 成人动漫在线观看视频| 天天av天天翘| 一二三四区在线| 伊人影院在线视频| 一区二区三区精密机械公司| 精品无码国产一区二区三区av| www视频在线观看| 精品av在线播放| www.日日操| 亚洲精品大全| 精品国产麻豆免费人成网站| 素人fc2av清纯18岁| 欧美特黄一级大片| 欧美成人在线网站| 国产成人亚洲精品自产在线| 裸体素人女欧美日韩| 国产一区二区丝袜| 成人午夜免费在线观看| 91麻豆精品秘密| 中文字幕一区二区三区有限公司 | 亚洲日本成人在线观看| 久久人人爽人人爽人人av| 范冰冰一级做a爰片久久毛片| 欧美日韩一区三区| 色哟哟视频在线| 欧美日韩精品在线一区| 欧美大片免费看| 色屁屁影院www国产高清麻豆| 久久精品国产久精国产爱| 国产成人看片| 美女毛片在线看| 夜夜精品视频一区二区| 丰满少妇在线观看| jizz性欧美23| 中文日韩在线视频| 日韩欧美a级片| 精品综合免费视频观看| 精品一区二区国产| av片在线观看永久免费| 色综合视频在线观看| 午夜性福利视频| 精品日产免费二区日产免费二区| 久久91超碰青草是什么| 久久精品视频1| 豆国产96在线|亚洲| 亚洲一区二区三区四区中文| 久草在线中文最新视频| 日韩一区二区三区四区| 粉嫩精品久久99综合一区| 伊人激情综合| 亚洲综合精品一区二区| 在线毛片网站| 日本精品一级二级| jizz日本免费| 在线观看日韩av电影| 91精品视频免费看| 在线免费观看黄色| 在线欧美一区二区| 亚洲欧美色图视频| 99成人在线| 国产精品国产亚洲精品看不卡15| 黄色一级大片在线免费看产| 欧美在线观看视频一区二区 | 精品不卡一区| 欧美专区在线视频| 手机在线观看毛片| 亚洲成人av电影在线| 精品国产乱码久久久久夜深人妻| 91精品电影| 成人黄色免费看| 日本在线天堂| 在线电影国产精品| 日本 欧美 国产| 麻豆精品久久精品色综合| 天天综合狠狠精品| 97精品国产综合久久久动漫日韩| 亚洲天堂开心观看| 久久久久亚洲视频| 国产亲近乱来精品视频| 亚洲成色www.777999| 国内精品久久久久久99蜜桃| 国产97在线观看| 二区在线观看| 欧美年轻男男videosbes| 国产破处视频在线观看| 老司机免费视频一区二区三区| 四虎影视永久免费在线观看一区二区三区 | 波多野结衣小视频| 国产欧美精品一区二区色综合朱莉| 日本熟妇人妻xxxxx| 精品视频97| 国产三级精品网站| 欧洲中文在线| 亚洲国产欧美一区二区三区久久| 免费在线观看黄网站| 久久综合999| www.色偷偷.com| 在线一区电影| 国产一级特黄a大片99| 亚洲精品**中文毛片| 国产一区二区三区视频| 97超碰资源站| 亚洲国产日韩在线一区模特| 黄色a一级视频| 久久精品免费看| av动漫在线播放| 日韩精品免费一区二区三区竹菊| 日本久久久久久久久久久| 一级日本在线| 亚洲国产精品人久久电影| 日本免费精品视频| 亚洲视频小说图片| 亚洲国产精品无码久久久久高潮| 久久精品卡一| 亚洲一区二区三区四区中文| 成人精品毛片| 国产精品久久久91| 男男gaygays亚洲| 国产性色av一区二区| 国产又粗又猛又黄又爽无遮挡| 亚洲国产精品久久人人爱蜜臀| 蜜桃av免费看| 国产精品中文字幕欧美| 欧美精品色婷婷五月综合| 日韩中文在线电影| 国产一区二区三区四区五区加勒比| 26uuu亚洲电影| 久久国产精品网站| 久草福利在线| 亚洲精品一区二区三区影院| 中文字幕av久久爽| 精品成人av一区| wwwav国产| 国产女同互慰高潮91漫画| 丰满人妻一区二区三区免费视频棣| 石原莉奈一区二区三区在线观看| 日韩精品免费一区| 国产精品99一区二区三区| 久草精品电影| 91亚洲精品视频在线观看| 国产精品欧美久久久| 天堂中文最新版在线中文| 久久成人18免费网站| av福利在线播放| 日韩精品久久久久久久玫瑰园| 国产强伦人妻毛片| 精品1区2区3区| 久久精品视频7| 亚洲电影一区二区三区| 欧美大片xxxx| 国产精品久久久久久久久免费丝袜| 亚洲欧美日本一区| 成人一区在线观看| 国产九九九视频| 狠狠色丁香久久婷婷综合_中| 嫩草av久久伊人妇女超级a| 亚洲美女黄网| 我的公把我弄高潮了视频| 综合天堂久久久久久久| 中文字幕免费在线不卡| 成人三级视频| 日韩精彩视频| 欧美女优在线视频| 欧美日韩精品不卡| 亚洲a级精品| 久久日韩精品| 亚洲精品进入| 欧美一区1区三区3区公司| 婷婷综合福利| 美乳视频一区二区| 亚洲人成亚洲精品| 欧美大陆一区二区| 亚洲97av| 少妇特黄a一区二区三区| 国产精品免费大片| 欧美日韩三区四区| 精品国产一级毛片| 亚洲精品视频一二三| 999精品视频| 偷拍盗摄高潮叫床对白清晰| 久久精品免费一区二区三区| 久久精品国产精品亚洲精品色 | 久久亚洲精品无码va白人极品| 亚洲欧美伊人| 91黄色在线看| 亚洲一区激情| 欧美视频第三页| 免费观看日韩av| 国产精品久久久久久久av福利| 精东粉嫩av免费一区二区三区| 亚洲第一色av| 国产成人自拍在线| av无码一区二区三区| 久久精品男人天堂av| 神马久久久久久久久久久| 国产精品欧美精品| 中文字幕av久久爽av| 亚洲国产视频一区二区| 毛片基地在线观看| 欧美在线视频不卡| 国产三级伦理片| 亚洲精品videossex少妇| 国产在线高清| 久久av.com| 亚洲性色av| 成人激情免费在线| 久久a级毛片毛片免费观看| 欧美亚洲免费高清在线观看| 日韩一区电影| 东北少妇不带套对白| 日韩高清在线一区| 永久看看免费大片| 26uuu久久综合| 免费成人深夜夜行网站| 亚洲午夜在线电影| 亚洲精品国产精品乱码视色| 欧美一二三四区在线| 日韩porn| 欧美xxxx14xxxxx性爽| 在线最新版中文在线| 国产欧美一区二区三区视频| 91成人噜噜噜在线播放| 日韩片电影在线免费观看| 午夜久久一区| 午夜精品在线免费观看| 成人精品免费网站| 亚洲 欧美 国产 另类| 亚洲va在线va天堂| 一区二区三区精彩视频| 日韩经典第一页| 哥也色在线视频| 秋霞成人午夜鲁丝一区二区三区| 九九99久久精品在免费线bt| 日韩一本精品| 国产精品久久777777毛茸茸| 99999精品| 国产精品入口麻豆原神| 成年人免费看毛片| 欧美一级黄色录像| 日韩在线免费电影| 日本免费久久高清视频| jazzjazz国产精品久久| a级黄色片网站| 美腿丝袜亚洲三区| 少妇真人直播免费视频| 亚洲一区二区三区视频在线播放| 91美女精品网站| 亚洲全黄一级网站| 欧美a级在线观看| 大波视频国产精品久久| 国产精品久久久久无码av| jizz欧美激情18| 久久精品夜色噜噜亚洲a∨| 日本中文字幕网| 日韩你懂的在线播放| 成人影欧美片| 91精品国产综合久久香蕉| jlzzjlzz亚洲女人| 激情网站五月天| 99re这里只有精品6| 日本视频www| 精品国产91久久久久久久妲己 | 国产精品成人一区二区三区吃奶| 狠狠久久伊人| 日韩日韩日韩日韩日韩| 国产成人超碰人人澡人人澡| 成人免费视频国产免费观看| 在线电影院国产精品| 美女隐私在线观看| 成人免费看黄网站| 午夜影院欧美| 男女视频在线观看网站| 亚洲免费大片在线观看| 国产精品系列视频| 久久不射热爱视频精品| 一区二区网站| 人人妻人人澡人人爽欧美一区双| 国产suv一区二区三区88区| 久草免费新视频| 欧美精品一区二区三区四区 | 国产精品吹潮在线观看| 国产精品亚洲二区| 香港日本韩国三级网站| 成人欧美一区二区三区| aaa级黄色片| 欧美激情图片区| 欧美激情15p| 三年中国国语在线播放免费| 国产精品素人视频| 国产麻豆精品一区| 欧美激情视频一区二区三区不卡| 看全色黄大色大片免费久久久| 日本在线xxx| 国产日韩欧美亚洲| 91欧美日韩麻豆精品| 欧美国产日韩精品| 欧美调教视频| 国产高潮免费视频| 曰韩精品一区二区| 狠狠人妻久久久久久综合麻豆| 欧洲中文字幕国产精品| 日韩精品影视| zjzjzjzjzj亚洲女人| 91黄视频在线观看| 成人免费看片| 久久99精品久久久久久青青日本| 日韩av一区二| 欧美成人三级视频| 亚洲男人的天堂在线| 国产精品视频一区二区三区综合| 97碰在线视频| 国产女主播一区| 免费观看国产视频| 国产精品免费久久久久影院| 国产精品av久久久久久麻豆网| 色天使在线视频| 欧美一二三区在线| 精品亚洲美女网站| 成人在线国产视频| 国产精品美日韩| 天天射,天天干| 91亚洲精品久久久| 噜噜爱69成人精品| 麻豆精品一区二区三区视频| 亚洲欧美资源在线| 亚洲日本va中文字幕| 少妇激情一区二区三区| 亚洲一区二区三区美女|