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

Redisson雜談,你學到了什么?

開發 前端
本文主要簡單講述了在 Redisson 中分布式鎖的實現。其實在 Redisson 中還有很多值得深挖的點。比如:Redisson 中使用了大量 Netty 的特性。大家有興趣的話,可以仔細研究一下。

一.Redisson 簡介

Redisson 是一個基于 Netty 通信框架的高性能 Redis 客戶端, 實現了分布式和可擴展的 Java 數據結構,提供很多分布式相關操作服務以及大量便利的工具方法,讓開發者可以把精力放在開發業務,避免重復造輪子。

二.Redisson 優點

1.通信框架基于 Netty,使用多路復用。吞吐量高。

2.兼容支持 Redis 集群模式,Reids 哨兵模式等,天然適配分布式服務。

3.提供多種分布式對象的封裝,如:Bloom Filter,Object Bucket,Bitset,AtomicLong, 和 HyperLogLog 等。

4.提供分布式鎖實現包括:

RedissonFairLock 公平鎖,

RedissonLock 非公平鎖,

RedissonRedLock 紅鎖(基于紅鎖算法, 當集群中大多數( N/2 + 1 )加鎖成功了,則認為加鎖成功,

目前已被棄用,Redisson 官方不再建議使用)。

三.RedissonLock 分布式鎖相關部分源碼解析

RedissonLock 作為分布式鎖,實現了可重入鎖。阻塞鎖,非阻塞鎖。并且 Redisson 存在看門狗機制,可以對未手動設置超時時間的鎖實現自動續期。

1.Trylock 加鎖

加鎖代碼邏輯

/**
*
* @param waitTime 獲取鎖的最大等待時間,默認 -1,
* @param leaseTime 鎖的過期時間,默認 -1
* @param unit
* @param threadId
* @return
*/
private RFuture<Boolean> tryAcquireOnceAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId) {
  RFuture<Boolean> acquiredFuture;
  if (leaseTime > 0) {
    //若手動設置了鎖的過期時間,則加鎖時以當前傳入過期時間為準
    //執行Lua腳本,加鎖
    acquiredFuture = tryLockInnerAsync(waitTime, leaseTime, unit, 
    threadId,RedisCommands.EVAL_NULL_BOOLEAN);                                                 
  } else {
    //若未手動設置,則默認過期時間等于配置的lockWatchdogTimeout,lockWatchdogTimeout默認為30s。
    //然后執行Lua腳本,加鎖
    acquiredFuture = tryLockInnerAsync(waitTime, internalLockLeaseTime,
    TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_NULL_BOOLEAN);
  }

  CompletionStage<Boolean> f = acquiredFuture.thenApply(acquired -> {
  //lock acquired
  //若鎖成功獲取到
  if (acquired) {
    if (leaseTime > 0) {
      internalLockLeaseTime = unit.toMillis(leaseTime);
      } else {
      //若未手動設置過期時間,則執行看門狗任務,自動續期
      scheduleExpirationRenewal(threadId);
    }
  }
  return acquired;
  });
  return new CompletableFutureWrapper<>(f);
}

加鎖 Lua 腳本如下:

if (redis.call('exists', KEYS[1]) == 0) then " +
  "redis.call('hincrby', KEYS[1], ARGV[2], 1); " +
  "redis.call('pexpire', KEYS[1], ARGV[1]); " +
  "return nil; " +
  "end; " +
  "if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then " +
  "redis.call('hincrby', KEYS[1], ARGV[2], 1); " +
  "redis.call('pexpire', KEYS[1], ARGV[1]); " +
  "return nil; " +
  "end; " +
  "return redis.call('pttl', KEYS[1]);

其中 KEYS[1] 是鎖邏輯名稱,ARGV[1] 是 key 的過期時間,ARGV[2]是鎖的線程級別名稱( uuid + 線程id ,uuid 是每個 Redisson 客戶端創建時唯一生成的)。

由此可看出,鎖利用 Hash 結構實現,其中 Hash 的 key 是鎖的邏輯名稱,field 是鎖的線程級別名稱,value 是鎖的重入次數。

加鎖 Lua 腳本的含義:

先判斷當前邏輯鎖名稱的 key 是否存在,

若不存在,在 Hash 結構中設置這個鎖,鎖重入次數加 1,然后給 key 設置一個過期時間,最后返回 null。

若存在,并且已經被當前線程持有,就鎖可重入次數加 1,并且重新設置 key 的過期時間,最后返回 null,

若當前鎖被其他線程持有,返回 key 剩余過期時間。

2.Lock 阻塞鎖

Lock 阻塞鎖與 Trylock 底層調用代碼基本一致。多了一個等待鎖被其他線程釋放后,重新嘗試加鎖的過程。

代碼如下:

private void lock(long leaseTime, TimeUnit unit, boolean interruptibly) throws InterruptedException {
  long threadId = Thread.currentThread().getId();
  Long ttl = tryAcquire(-1, leaseTime, unit, threadId);
  // lock acquired
  if (ttl == null) {
    return;
  }
  //訂閱釋放鎖消息
  CompletableFuture<RedissonLockEntry> future = subscribe(threadId);
  pubSub.timeout(future);
  RedissonLockEntry entry;
  if (interruptibly) {
    entry = commandExecutor.getInterrupted(future);
  } else {
    entry = commandExecutor.get(future);
  }

  try {
    while (true) {
      //重新嘗試取鎖
      ttl = tryAcquire(-1, leaseTime, unit, threadId);
      // lock acquired
      if (ttl == null) {
        break;
      }
      // waiting for message,
      if (ttl >= 0) {
        try {
          //當鎖仍然被其他線程占有時,調用
          //java.util.concurrent.Semaphore#tryAcquire方法進行信號量阻塞,
          //當線程阻塞等待時間超過最大超時時間(ttl即鎖的key的剩余存活時間)
          //或者 監聽到鎖釋放消息后,信號量被釋放后,線程不再阻塞
          entry.getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
          if (interruptibly) {
            throw e;
          }
          entry.getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);
        }
      } else {
        if (interruptibly) {
          //嘗試從信號量獲取一個許可
          entry.getLatch().acquire();
        } else {
          entry.getLatch().acquireUninterruptibly();
        }
      }
    }
  } finally {
  //取消訂閱鎖釋放消息
  unsubscribe(entry, threadId);
}

大致流程如下:

1.先獲取鎖,若獲取鎖成功,直接返回。

2.若獲取失敗,訂閱釋放鎖消息。

3.進入 while 循環,重新嘗試獲取鎖。若獲取鎖成功,則跳出循環,并不再訂閱釋放鎖消息。

4.若重新獲取鎖失敗,進行信號量阻塞,直到鎖被其他占有線程釋放(監聽鎖釋放消息的監聽器中,有喚醒信號量的邏輯)或者到達阻塞超時時間,然后繼續這個 while 循環。

3.Unlock 解鎖

代碼如下

public RFuture<Void> unlockAsync(long threadId) {
  //執行解鎖lua腳本
  RFuture<Boolean> future = unlockInnerAsync(threadId);

  CompletionStage<Void> f = future.handle((opStatus, e) -> {
    //取消看門狗任務
    cancelExpirationRenewal(threadId);

    if (e != null) {
      throw new CompletionException(e);
    }
    if (opStatus == null) {
      IllegalMonitorStateException cause = new IllegalMonitorStateException
      ("attempt to unlock lock, not locked by current thread by node id: "
      + id + " thread-id: " + threadId);
      throw new CompletionException(cause);
    }
    return null;
  });

  return new CompletableFutureWrapper<>(f);
}

1.其中解鎖 Lua 腳本如下:

if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) then " +
  "return nil;" +
  "end; " +
  "local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1); " +
  "if (counter > 0) then " +
  "redis.call('pexpire', KEYS[1], ARGV[2]); " +
  "return 0; " +
  "else " +
  "redis.call('del', KEYS[1]); " +
  "redis.call('publish', KEYS[2], ARGV[1]); " +
  "return 1; " +
  "end; " +
  "return nil;

其中 KEYS[1] 為鎖的邏輯名稱,KEYS[2] 為通道名稱,ARGV[1] 為 0, ARGV[2] 為鎖的過期時間,默認 30s,ARGV[3] 為鎖的線程級別名稱。

解鎖 Lua 腳本含義:

解鎖時,先判斷當前鎖是否被當前線程持有,

若不是,則返回 null。

若是,鎖的可重入次數 減1。

然后繼續判斷鎖的可重入次數是否大于 0,若大于 0,繼續給這個鎖 key 續期 30s,并且最后返回 0。

若不大于 0,刪除這個鎖的 key,并向指定通道發布這個解鎖消息,并且返回 1。

2.如果這個鎖有看門狗任務在定時續期,當解鎖成功時會取消這個定時續期任務。

4.看門狗機制

當某個鎖內的任務的執行時間不可預估時,可能執行時間很長,也可能很短。此時若直接設置一個固定的鎖過期時間,可能會導致任務執行時間遠遠大于鎖的過期時間,導致任務還未執行完成,但是鎖已經過期了。那其他線程又可以獲取到鎖,然后執行該任務了,最終導致線程安全問題。

為應對這種情況,定期給鎖續期的看門狗機制出現了。

代碼:

//真正看門狗續期任務
private void renewExpiration() {
  ExpirationEntry ee = EXPIRATION_RENEWAL_MAP.get(getEntryName());
  if (ee == null) {
    return;
  }
  //創建一個延時任務,底層實現是netty時間輪。當每過了lockWatchdogTimeout/3的時間,執行該任務
  Timeout task = commandExecutor.getConnectionManager().newTimeout(new TimerTask() {
    @Override
    public void run(Timeout timeout) throws Exception {
      ExpirationEntry ent = EXPIRATION_RENEWAL_MAP.get(getEntryName());
        if (ent == null) {
          return;
        }
        Long threadId = ent.getFirstThreadId();
        //若當前鎖已經被當前線程釋放,則鎖不再續期
        if (threadId == null) {
          return;
        }
        //調用Lua腳本,判斷當前鎖是否被當前線程占有,若是則返回true,
        //并且重新設置key的過期時間,默認30s
        CompletionStage<Boolean> future = renewExpirationAsync(threadId);
        future.whenComplete((res, e) -> {
          if (e != null) {
            log.error("Can't update lock " + getRawName() + " expiration", e);
            EXPIRATION_RENEWAL_MAP.remove(getEntryName());
            return;
            }
            //當鎖仍然被當前線程占有,說明業務代碼還在執行,則遞歸調用續期任務
            if (res) {
              // reschedule itself
              log.info("續期任務執行"+ "threadId:" +threadId);
              renewExpiration();
            } else {
              //否則移除該續期任務,直接在EXPIRATION_RENEWAL_MAP移除ExpirationEntry
              cancelExpirationRenewal(null);
            }
        });
    }
  }, internalLockLeaseTime / 3, TimeUnit.MILLISECONDS);
  
  ee.setTimeout(task);
}

當沒有顯式指定鎖過期時間時候,就默認 key 過期時間 30s,然后定時任務每 10 秒( lockWatchdogTimeout/3 )進行一次調用,執行鎖續期動作,若這個線程還持有這個鎖,就對這個線程持有的鎖進行續期操作(通過 pexpire 續期 key 30s),若途中持有鎖的線程 手動被 unlock 或者機器宕機才會取消這個任務。否則會一直續期。

四.總結

Redisson 作為一個 Redis 客戶端,基于 Redis、Lua 和 Netty 建立起了一套完善的分布式解決方案,比如分布式鎖的實現,分布式對象的操作等。本文主要簡單講述了在 Redisson 中分布式鎖的實現。其實在 Redisson 中還有很多值得深挖的點。比如:Redisson 中使用了大量 Netty 的特性。大家有興趣的話,可以仔細研究一下。

五.參考文章

https://github.com/redisson/redisson/wiki

https://cloud.tencent.com/developer/article/1500854

責任編輯:武曉燕 來源: 政采云技術
相關推薦

2023-04-10 07:40:36

GraphQLRest通信模式

2022-07-19 08:04:04

HTTP應用層協議

2023-06-03 00:05:18

TypeScriptJSDoc掃描器

2024-11-13 09:22:40

2024-04-12 08:54:13

從庫數據庫應用

2024-07-31 09:28:56

2024-10-18 11:48:00

2024-08-12 15:44:06

2025-02-28 00:03:00

2023-06-06 08:14:18

核心Docker應用程序

2023-04-26 22:52:19

視覺人臉檢測人臉對齊

2021-03-09 09:55:02

Vuejs前端代碼

2021-09-03 06:46:34

MyBatis緩存后端

2023-04-26 01:25:05

案例故障模型

2021-12-26 18:30:56

嵌入式ARM鏈接

2023-06-30 07:30:38

2023-05-19 07:31:48

2021-07-29 18:46:52

可視化類型圖形化

2015-09-06 16:03:57

2021-07-28 07:01:09

薅羊毛架構Vue+SSR
點贊
收藏

51CTO技術棧公眾號

亚洲主播在线播放| 久久激情五月婷婷| 亚洲另类图片色| 少妇黄色一级片| av在线下载| 91网站在线播放| 国产男女猛烈无遮挡91| 久久这里只有精品免费| 欧美最新另类人妖| 精品国产一二三区| 一道本在线免费视频| 里番在线播放| 国产精品久久久爽爽爽麻豆色哟哟| 成人动漫视频在线观看免费| 亚洲 日本 欧美 中文幕| 亚洲国产日韩欧美在线| 亚洲视频一区二区三区| 中文字幕一二三| 国产精品成人国产| 狠狠躁18三区二区一区| 超碰10000| 视频一区二区三区不卡| www欧美成人18+| 99国产在线| 中文天堂在线播放| 99热在线精品观看| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲精品成人自拍| 五十路在线观看| 国产高清在线精品| 国产日韩av在线| 精品国产xxx| 亚洲片区在线| 欧美俄罗斯性视频| a级片在线观看免费| 91麻豆精品国产91久久久平台| 精品网站999www| 秘密基地免费观看完整版中文| 在线不卡一区| 欧美日韩美女一区二区| www.99在线| 久久爱91午夜羞羞| 欧美日韩亚洲成人| 国产原创中文在线观看 | 亚洲天堂一区二区在线观看| 亚洲mmav| 欧美专区日韩专区| 欧美一级裸体视频| 欧洲av一区二区| 色天使色偷偷av一区二区| av之家在线观看| 色资源二区在线视频| 高跟丝袜欧美一区| 黄www在线观看| 国产精品粉嫩| 欧美综合天天夜夜久久| 99热这里只有精品在线播放| 国产伊人久久| 6080国产精品一区二区| 欧美日韩久久婷婷| 77成人影视| 亚洲高清av在线| 波多野结衣有码| 亚洲va久久久噜噜噜久久| 亚洲热线99精品视频| 国产美女永久免费无遮挡| 人人狠狠综合久久亚洲婷婷| 中文字幕亚洲无线码在线一区| 日本免费网站视频| 午夜亚洲福利| 78m国产成人精品视频| 日日骚av一区二区| 六月婷婷色综合| 亚洲一区二区三区777| 亚洲爱爱综合网| 97久久精品人人做人人爽| 欧美一区二区影视| 婷婷成人激情| 亚洲尤物在线视频观看| 久久久久人妻精品一区三寸| 日韩毛片一区| 日韩一级欧美一级| 色天使在线视频| 日韩片欧美片| 久久久久久有精品国产| 手机看片久久久| 久久国产精品免费| 国产成人精品自拍| yiren22综合网成人| 国产精品久久久久久久久久久免费看| avove在线观看| 成人美女黄网站| 欧美一区二区黄| 四虎影成人精品a片| 亚洲91久久| 日韩美女激情视频| 999av视频| 久久人人爽人人爽| 干日本少妇视频| 91精品xxx在线观看| 欧美一区二区高清| 午夜精产品一区二区在线观看的| 午夜免费一区| 国产999精品| 亚洲老妇色熟女老太| 欧美韩日一区二区三区四区| 欧美久久在线观看| 粉嫩91精品久久久久久久99蜜桃| 精品乱码亚洲一区二区不卡| 亚洲天堂av中文字幕| 在线亚洲欧美| 99在线视频首页| 亚洲视频tv| 一本大道久久a久久精二百| 亚洲国产欧美日韩在线| 欧美日中文字幕| 欧美制服第一页| 亚洲av无码国产精品永久一区| 欧美国产成人在线| 毛片在线视频播放| 亚洲精品不卡在线观看| 色老头一区二区三区| 日本中文字幕第一页| 成人性生交大合| 国产日韩第一页| 黄色精品视频网站| 亚洲午夜小视频| 欧美另类一区二区| 成人午夜电影小说| xxxxxx在线观看| 黄色精品视频网站| 中文字幕久热精品视频在线| 五月天婷婷久久| 99精品视频一区二区| 丰满少妇大力进入| 亚洲国产视频二区| 色中色综合影院手机版在线观看| 一级特黄aaaaaa大片| 国产亚洲成av人在线观看导航| 国产九九九九九| 另类在线视频| 91精品国产乱码久久久久久蜜臀| 亚洲av永久无码国产精品久久| 亚洲精品视频免费看| www.桃色.com| 伊人久久大香线蕉综合四虎小说| 国产精品综合不卡av| av影片在线看| 欧美日韩另类一区| 国产精品夜夜夜爽阿娇| 精品无人码麻豆乱码1区2区 | 久久精品丝袜高跟鞋| av影视在线看| 亚洲国产天堂久久综合网| 日本一区二区欧美| 99精品桃花视频在线观看| 日韩欧美一区二| 国产精品自拍区| 国产综合视频在线观看| 看黄网站在线观看| 日韩三级视频在线观看| 久久久久久久蜜桃| 99久久夜色精品国产网站| 欧美牲交a欧美牲交| 精品久久久中文字幕| 国产日韩欧美一二三区| a天堂中文在线官网在线| 精品人伦一区二区色婷婷| 在线免费观看毛片| 久久亚洲精品小早川怜子| 杨幂毛片午夜性生毛片| 亚洲五月综合| 国产在线播放一区二区| 亚洲a∨精品一区二区三区导航| 亚洲欧美另类在线观看| 伊人精品在线视频| 亚洲最大成人网4388xx| 国产色视频一区二区三区qq号| 日韩电影在线免费| 国产三级中文字幕| 老司机成人在线| 国产精品日韩精品| 亚洲无线看天堂av| 亚洲美女久久久| 国产又粗又猛视频免费| 亚洲成人tv网| 亚洲图片第一页| 国产91露脸合集magnet| 欧美少妇性生活视频| 99视频精品全国免费| 国产亚洲精品美女久久久m| 国产免费不卡| 欧美日韩国产成人在线观看| 九九在线视频| 欧美tk—视频vk| 中文无码av一区二区三区| 亚洲一卡二卡三卡四卡无卡久久| 欧美特级黄色录像| 成人午夜电影久久影院| 亚洲欧美国产日韩综合| 中文日韩在线| 成人污网站在线观看| 国产精品羞羞答答在线观看| 不卡日韩av| 国产69精品久久久久9999人| 午夜精品免费视频| 黄色在线免费看| 亚洲偷欧美偷国内偷| 搡老岳熟女国产熟妇| 制服丝袜亚洲播放| 精品人妻一区二区三区潮喷在线| 亚洲国产精品久久艾草纯爱| 国产视频精品免费| 久久精品日韩一区二区三区| 久久久久久久久久久久国产精品| 久久综合综合久久综合| 欧美在线观看成人| 欧美日韩99| 麻豆一区二区三区在线观看| 欧美性感美女一区二区| 欧美一区二区三区四区五区六区| av男人一区| 91午夜理伦私人影院| 国产福利91精品一区二区| 欧美专区在线观看| 理论片午夜视频在线观看| 欧美日韩福利电影| www久久日com| 久久国产一区二区三区| 在线激情网站| 色吧影院999| 最新97超碰在线| 伊人久久久久久久久久久久久 | 99久久99久久免费精品蜜臀| 亚洲性图第一页| 国产成人一区在线| 在线观看一区二区三区视频| 国产在线精品一区二区夜色 | xxx欧美精品| 一本一道波多野毛片中文在线 | 欧美精品欧美精品系列c| 美女网站色精品尤物极品姐弟| wwwxx欧美| eeuss鲁片一区二区三区| 99久久自偷自偷国产精品不卡| 欧美a在线观看| 91精品国产综合久久久久久丝袜| 日韩有吗在线观看| 99久久久精品免费观看国产| 日韩三级网址| 国产欧美日韩在线播放| 牛牛影视久久网| 欧美精品国产精品久久久| 精品视频自拍| 欧美日本亚洲| 欧美一级精品| 中文字幕乱码一区二区三区 | 春日野结衣av| 老鸭窝毛片一区二区三区| 欧美少妇性生活视频| 蜜桃精品在线观看| 色综合五月婷婷| 国产成人在线视频网址| 99久久国产精| 国产免费成人在线视频| 小早川怜子一区二区的演员表| 亚洲三级理论片| 国产真人真事毛片| 黑人巨大精品欧美一区二区免费 | 日韩禁在线播放| 激情综合闲人网| 日韩在线播放av| 国产理论电影在线| 欧美专区福利在线| 亚洲91在线| 国产精品毛片一区视频| 亚洲激情播播| 超碰成人在线免费观看| 在线成人h网| 一女被多男玩喷潮视频| 美女一区二区三区在线观看| 91精品人妻一区二区三区四区| 91美女在线视频| 乱h高h女3p含苞待放| 精品成人国产在线观看男人呻吟| 中文字幕视频一区二区| 精品国产乱码久久| 在线观看免费高清完整| 久久久久久久国产精品视频| 婷婷激情一区| 9a蜜桃久久久久久免费| 少妇精品久久久一区二区| 99久热在线精品视频| 日韩va欧美va亚洲va久久| 人妻精品久久久久中文字幕69| 久久久国产综合精品女国产盗摄| 欧美成欧美va| 欧美性淫爽ww久久久久无| 欧美视频xxx| 少妇高潮久久77777| 色戒汤唯在线| 不卡一区二区三区四区五区| 成人中文在线| 欧美一级在线看| 国产专区欧美精品| 人妻一区二区视频| 亚洲a一区二区| 99国产精品久久久久久久成人| 亚洲热线99精品视频| av免费在线视| 亚洲自拍中文字幕| 日韩精品免费| 国产精品wwwww| 99亚偷拍自图区亚洲| 可以直接看的黄色网址| 欧美日韩国产综合草草| 狠狠v欧美ⅴ日韩v亚洲v大胸| 久久久视频免费观看| 亚洲精品tv| 亚洲美女搞黄| 天堂成人免费av电影一区| 在线天堂www在线国语对白| 亚洲乱码国产乱码精品精的特点 | 亚洲精品在线网站| 黄色网页在线免费看| 国产精品你懂得| 国产一区二区三区日韩精品| 免费看的黄色大片| 成人av高清在线| 久久综合亚洲色hezyo国产| 91麻豆精品91久久久久同性| 日本中文字幕视频在线| 国产精品久久久久aaaa九色| 国产成人精品999在线观看| 男人日女人下面视频| 99v久久综合狠狠综合久久| 国产五月天婷婷| 亚洲激情久久久| 国产美女高潮在线观看| 精品国产一区二区三区麻豆小说| 激情亚洲网站| 国产精品一区二区在线免费观看| 亚洲精品视频免费观看| 精品乱子伦一区二区| 欧美国产精品人人做人人爱| 成人av资源网址| 国产美女主播在线播放| 99久久久久久| 亚洲欧美偷拍视频| 国产一区二区日韩| 成人国产精选| av电影一区二区三区| 国产二区国产一区在线观看| 久久无码精品丰满人妻| 亚洲第一网中文字幕| 在线视频超级| 日本一区免费观看| 久久精品国产亚洲高清剧情介绍| 91ts人妖另类精品系列| 欧美一区二区网站| 不卡视频观看| 欧美不卡三区| 美腿丝袜亚洲色图| 波多野结衣爱爱视频| 精品国产sm最大网站免费看| 亚洲精品动漫| 一区二区三区免费看| 国产suv一区二区三区88区| 日韩污视频在线观看| 亚洲欧洲在线免费| 日韩一区二区三区四区五区| 成年丰满熟妇午夜免费视频| 9l国产精品久久久久麻豆| 在线永久看片免费的视频| www日韩欧美| 国产精品美女在线观看直播| 亚洲中文字幕无码不卡电影| 国产精品久久二区二区| 亚洲黄色在线观看视频| 人人做人人澡人人爽欧美| 天天做天天爱综合| 国产精品扒开腿做爽爽爽a片唱戏| 色婷婷久久久久swag精品| 欧美极品视频| 精品国产免费一区二区三区| 麻豆一区二区在线| 日韩成年人视频| 日韩中文在线视频| 红杏视频成人| 色呦色呦色精品| 欧美日韩免费区域视频在线观看| 日本视频在线观看| 久久国产一区| 国产一区视频导航| 岛国av中文字幕| 欧美日韩电影在线观看| 欧美一级精品| jizz日本免费| 日韩一级黄色大片| av激情成人网|