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

Redis Cluster基于客戶端對(duì)mget的性能優(yōu)化

數(shù)據(jù)庫(kù)
我們對(duì)客戶端JedisCluster的Multi-Key命令進(jìn)行改造,通過(guò)分別對(duì)Redis節(jié)點(diǎn)執(zhí)行pipeline操作,提升了mget命令的性能。

  • 1 背景
  • 2 分析原因
  • 2.1 現(xiàn)象
  • 2.2 定位問(wèn)題
  • 3 解決問(wèn)題
  • 3.1使用hashtag
  • 3.2 客戶端改造
  • 4 效果展示
  • 4.1 性能測(cè)試
  • 4.2 結(jié)論
  • 5 總結(jié)

一、 背景

Redis是知名的、應(yīng)用廣泛的NoSQL數(shù)據(jù)庫(kù),在轉(zhuǎn)轉(zhuǎn)也是作為主要的非關(guān)系型數(shù)據(jù)庫(kù)使用。我們主要使用Codis來(lái)管理Redis分布式集群,但隨著Codis官方停止更新和Redis Cluster的日益完善,轉(zhuǎn)轉(zhuǎn)也開(kāi)始嘗試使用Redis Cluster,并選擇Lettuce作為客戶端使用。但是在業(yè)務(wù)接入過(guò)程中發(fā)現(xiàn),使用Lettuce訪問(wèn)Redis Cluster的mget、mset等Multi-Key命令時(shí),性能表現(xiàn)不佳。

二、 分析原因

2.1 現(xiàn)象

業(yè)務(wù)在從Codis遷移到Redis Cluster的過(guò)程中,在Redis Cluster和Codis雙寫了相同的數(shù)據(jù)。結(jié)果Codis在比Redis Cluster多一次連接proxy節(jié)點(diǎn)的耗時(shí)下,同樣是mget獲取相同的數(shù)據(jù),使用Lettuce訪問(wèn)Redis Cluster還是比使用Jeds訪問(wèn)Codis耗時(shí)要高,于是我們開(kāi)始定位性能差異的原因。

2.2 定位問(wèn)題

2.2.1 Redis Cluster的架構(gòu)設(shè)計(jì)

導(dǎo)致Redis Cluster的mget性能不佳的根本原因,是Redis Cluster在架構(gòu)上的設(shè)計(jì)導(dǎo)致的。Redis Cluster基于smart client和無(wú)中心的設(shè)計(jì),按照槽位將數(shù)據(jù)存儲(chǔ)在不同的節(jié)點(diǎn)上

圖片圖片

如上圖所示,每個(gè)主節(jié)點(diǎn)管理不同部分的槽位,并且下面掛了多個(gè)從節(jié)點(diǎn)。槽位是Redis Cluster管理數(shù)據(jù)的基本單位,集群的伸縮就是槽和數(shù)據(jù)在節(jié)點(diǎn)之間的移動(dòng)。

通過(guò)CRC16(key) % 16384 來(lái)計(jì)算key屬于哪個(gè)槽位和哪個(gè)Redis節(jié)點(diǎn)。而且Redis Cluster的Multi-Key操作受槽位限制,例如我們執(zhí)行mget,獲取不同槽位的數(shù)據(jù),是限制執(zhí)行的:

圖片圖片

2.2.2 Lettuce的mget實(shí)現(xiàn)方式

lettuce對(duì)Multi-Key進(jìn)行了支持,當(dāng)我們調(diào)用mget方法,涉及跨槽位時(shí),Lettuce對(duì)mget進(jìn)行了拆分執(zhí)行和結(jié)果合并,代碼如下:

public RedisFuture<List<KeyValue<K, V>>> mget(Iterable<K> keys) {
    //將key按照槽位拆分
    Map<Integer, List<K>> partitioned = SlotHash.partition(codec, keys);

    if (partitioned.size() < 2) {
        return super.mget(keys);
    }
    Map<K, Integer> slots = SlotHash.getSlots(partitioned);
    Map<Integer, RedisFuture<List<KeyValue<K, V>>>> executions = new HashMap<>();
    //對(duì)不同槽位的keys分別執(zhí)行mget
    for (Map.Entry<Integer, List<K>> entry : partitioned.entrySet()) {
        RedisFuture<List<KeyValue<K, V>>> mget = super.mget(entry.getValue());
        executions.put(entry.getKey(), mget);
    }
    // 獲取、合并、排序結(jié)果
    return new PipelinedRedisFuture<>(executions, objectPipelinedRedisFuture -> {
        List<KeyValue<K, V>> result = new ArrayList<>();
        for (K opKey : keys) {
            int slot = slots.get(opKey);

            int position = partitioned.get(slot).indexOf(opKey);
            RedisFuture<List<KeyValue<K, V>>> listRedisFuture = executions.get(slot);
            result.add(MultiNodeExecution.execute(() -> listRedisFuture.get().get(position)));
        }

        return result;
    });
}

mget涉及多個(gè)key的時(shí)候,主要有三個(gè)步驟:

1、按照槽位 將key進(jìn)行拆分;

2、分別對(duì)相同槽位的key去對(duì)應(yīng)的槽位mget獲取數(shù)據(jù);

3、將所有執(zhí)行的結(jié)果按照傳參的key順序排序返回。

所以Lettuce客戶端,執(zhí)行mget獲取跨槽位的數(shù)據(jù),是通過(guò)槽位分發(fā)執(zhí)行mget,并合并結(jié)果實(shí)現(xiàn)的。而Lettuce基于Netty的NIO框架實(shí)現(xiàn),發(fā)送命令不會(huì)阻塞IO,但是處理請(qǐng)求是單連接串行發(fā)送命令:

圖片圖片

所以Lettuce的mget的key數(shù)量越多,涉及的槽位數(shù)量越多,性能就會(huì)越差。Codis也是拆分執(zhí)行mget,不過(guò)是并發(fā)發(fā)送命令,并使用pipeline提高性能,進(jìn)而減少了網(wǎng)絡(luò)的開(kāi)銷。

三、 解決問(wèn)題

3.1使用hashtag

我們首先想到的是 客戶端分別執(zhí)行分到不同槽位的請(qǐng)求,導(dǎo)致耗時(shí)增加。我們可以將我們需要同時(shí)操作到的key,放到同一個(gè)槽位里去。我們是可以通過(guò)hashtag來(lái)實(shí)現(xiàn)

hashtag用于Redis Cluster中。hashtag 規(guī)定以key里{}里的內(nèi)容來(lái)做hash,比如 user:{a}:zhangsan和user:{a}:lisi就會(huì)用a去hash,保證帶{a}的key都落到同一個(gè)slot里

利用hashtag對(duì)key進(jìn)行規(guī)劃,使得我們mget的值都在同一個(gè)槽位里。

圖片圖片

但是這種方式需要業(yè)務(wù)方感知到Redis Cluster的分片的存在,需要對(duì)Redis Cluster的各節(jié)點(diǎn)存儲(chǔ)做規(guī)劃,保證數(shù)據(jù)平均的分布在不同的Redis節(jié)點(diǎn)上,對(duì)業(yè)務(wù)方使用上太不友好,所以舍棄了這種方案。

3.2 客戶端改造

另一種方案是在客戶端做改造,這樣做成本較低。不需要業(yè)務(wù)方感知和維護(hù)hashtag。

我們利用pipeline對(duì)Redis節(jié)點(diǎn)批量發(fā)送get命令,相對(duì)于Lettuce串行發(fā)送mget命令來(lái)說(shuō),減少了多次跨槽位mget發(fā)送命令的網(wǎng)絡(luò)耗時(shí)。具體步驟如下:

1、把所有key按照所在的Redis節(jié)點(diǎn)拆分;

2、通過(guò)pipeline對(duì)每個(gè)Redis節(jié)點(diǎn)批量發(fā)送get命令;

3、獲取所有命令執(zhí)行結(jié)果,排序、合并結(jié)果,并返回。

這樣改造,使用pipeline一次發(fā)送批量的命令,減少了串行批量發(fā)送命令的網(wǎng)絡(luò)耗時(shí)。

3.2.1 改造JedisCluster

由于Lettuce沒(méi)有原生支持pipeline批量提交命令,而JedisCluster原生支持pipeline,并且JedisCluster沒(méi)有對(duì)Multi-Key進(jìn)行支持,我們對(duì)JedisCluster的mget進(jìn)行了改造,代碼如下:

public List<String> mget(String... keys) {
        List<Pipeline> pipelineList = new ArrayList<>();
        List<Jedis> jedisList = new ArrayList<>();
        try {
            //按照key的hash計(jì)算key位于哪一個(gè)redis節(jié)點(diǎn)
            Map<JedisPool, List<String>> pooling = new HashMap<>();
            for (String key : keys) {
                JedisPool pool = connectionHandler.getConnectionPoolFromSlot(JedisClusterCRC16.getSlot(key));
                pooling.computeIfAbsent(pool, k -> new ArrayList<>()).add(key);
            }
            //分別對(duì)每個(gè)redis 執(zhí)行pipeline get操作
            Map<String, Response<String>> resultMap = new HashMap<>();
            for (Map.Entry<JedisPool, List<String>> entry : pooling.entrySet()) {
                Jedis jedis = entry.getKey().getResource();
                Pipeline pipelined = jedis.pipelined();
                for (String key : entry.getValue()) {
                    Response<String> response = pipelined.get(key);
                    resultMap.put(key, response);
                }
                pipelined.flush();
                //保存所有連接和pipeline 最后進(jìn)行close
                pipelineList.add(pipelined);
                jedisList.add(jedis);
            }
            //同步所有請(qǐng)求結(jié)果
            for (Pipeline pipeline : pipelineList) {
                pipeline.returnAll();
            }
            //合并、排序結(jié)果
            List<String> list = new ArrayList<>();
            for (String key : keys) {
                Response<String> response = resultMap.get(key);
                String o = response.get();
                list.add(o);
            }
            return list;
        }finally {
            //關(guān)閉所有pipeline和jedis連接
            pipelineList.forEach(Pipeline::close);
            jedisList.forEach(Jedis::close);
        }
    }

3.2.2 處理異常case

上面的代碼還不足以覆蓋所有場(chǎng)景,我們還需要處理一些異常case

  • Redis Cluster擴(kuò)縮容導(dǎo)致的數(shù)據(jù)遷移

數(shù)據(jù)遷移會(huì)造成兩種錯(cuò)誤

1、MOVED錯(cuò)誤

代表數(shù)據(jù)所在的槽位已經(jīng)遷移到另一個(gè)redis節(jié)點(diǎn)上了,服務(wù)端會(huì)告訴客戶端對(duì)應(yīng)的槽的目標(biāo)節(jié)點(diǎn)信息。此時(shí)我們需要做的是更新客戶端緩存的槽位信息,并嘗試重新獲取數(shù)據(jù)。

2、ASKING錯(cuò)誤

代表槽位正在遷移中,且數(shù)據(jù)不在源節(jié)點(diǎn)中,我們需要先向目標(biāo)Redis節(jié)點(diǎn)執(zhí)行ASKING命令,才能獲取遷移的槽位的數(shù)據(jù)。

List<String> list = new ArrayList<>();
for (String key : keys) {
    Response<String> response = resultMap.get(key);
    String o;
    try {
        o = response.get();
        list.add(o);
    } catch (JedisRedirectionException jre) {
        if (jre instanceof JedisMovedDataException) {
            //此槽位已經(jīng)遷移 更新客戶端的槽位信息
            this.connectionHandler.renewSlotCache(null);
        }
        boolean asking = false;
        if (jre instanceof JedisAskDataException) {
            //獲取槽位目標(biāo)redis節(jié)點(diǎn)的連接 設(shè)置asking標(biāo)識(shí),以便在重試前執(zhí)行asking命令
            asking = true;
 askConnection.set(this.connectionHandler.getConnectionFromNode(jre.getTargetNode()));
        } else {
            throw new JedisClusterException(jre);
        }
        //重試獲取這個(gè)key的結(jié)果
        o = runWithRetries(this.maxAttempts, asking, true, key);
        list.add(o);
    }
}

數(shù)據(jù)遷移導(dǎo)致的兩種異常,會(huì)進(jìn)行重試。重試會(huì)導(dǎo)致耗時(shí)增加,并且如果達(dá)到最大重試次數(shù),還沒(méi)有獲取到數(shù)據(jù),則拋出異常。

  • pipeline的某個(gè)命令執(zhí)行失敗

不捕獲執(zhí)行失敗的異常,拋出異常讓業(yè)務(wù)服務(wù)感知到異常發(fā)生。

四、 效果展示

4.1 性能測(cè)試

在改造完客戶端之后,我們對(duì)客戶端的mget進(jìn)行了性能測(cè)試,測(cè)試了下面三種類型的耗時(shí)

1、使用Jedis訪問(wèn)Codis

2、使用改造的JedisCluster訪問(wèn)Redis Cluster

3、使用Lettuce同步方式訪問(wèn)Redis Cluster

4.1.1 mget 100key


Codis

JedisCluster(改造)

Lettuce

avg

0.411ms

0.224ms

0.61ms

tp99

0.528ms

0.35ms

1.53ms

tp999

0.745ms

1.58ms

3.87ms

4.1.2 mget 500key


Codis

JedisCluster(改造)

Lettuce

avg

0.96ms

0.511ms

2.14ms

tp99

1.15ms

0.723ms

3.99ms

tp999

1.81ms

1.86ms

6.88ms

4.1.3 mget 1000key


Codis

JedisCluster(改造)

Lettuce

avg

1.56ms

0.92ms

5.04ms

tp99

1.83ms

1.22ms

8.91ms

tp999

3.15ms

3.88ms

32ms

4.2 結(jié)論

  • 使用改造的客戶端訪問(wèn)Redis Cluster,比使用Lettuce訪問(wèn)Redis Cluster要快1倍以上;
  • 改造的客戶端比使用codis稍微快一點(diǎn),tp999不如codis性能好。

但是改造的客戶端相對(duì)于Lettuce也有缺點(diǎn),JedisCluster是基于復(fù)雜的連接池實(shí)現(xiàn),連接池的配置會(huì)影響客戶端的性能。而Lettuce是基于Netty的NIO框架實(shí)現(xiàn),對(duì)于大多數(shù)的Redis操作,只需要維持單一的連接即可高效支持并發(fā)請(qǐng)求,不需要業(yè)務(wù)考慮連接池的配置。

五、 總結(jié)

Redis Cluster在架構(gòu)設(shè)計(jì)上對(duì)Multi-Key進(jìn)行的限制,導(dǎo)致無(wú)法跨槽位執(zhí)行mget等命令。我們對(duì)客戶端JedisCluster的Multi-Key命令進(jìn)行改造,通過(guò)分別對(duì)Redis節(jié)點(diǎn)執(zhí)行pipeline操作,提升了mget命令的性能。

責(zé)任編輯:龐桂玉 來(lái)源: 轉(zhuǎn)轉(zhuǎn)技術(shù)
相關(guān)推薦

2023-02-16 08:00:00

數(shù)據(jù)流客戶端開(kāi)發(fā)數(shù)據(jù)集

2009-06-12 19:18:08

REST客戶端框架JavaScript

2009-12-07 18:26:36

WCF客戶端

2011-08-15 14:09:59

JavaHBase

2011-04-22 10:34:09

SimpleFrame

2022-03-19 12:16:49

Redis高并發(fā)系統(tǒng)集群部署

2009-03-18 14:44:34

LinuxqTwitterTwitter

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2025-01-07 08:10:00

CefSharpWinformWindows

2022-04-15 10:52:50

模型技術(shù)實(shí)踐

2022-09-15 16:48:30

MySQL數(shù)據(jù)庫(kù)測(cè)試

2021-08-01 23:18:21

Redis Golang命令

2011-03-21 14:53:36

Nagios監(jiān)控Linux

2011-04-06 14:24:20

Nagios監(jiān)控Linux

2011-08-17 10:10:59

2009-06-23 14:00:49

JavaFX開(kāi)發(fā)

2024-09-11 09:50:22

2021-06-22 15:06:13

Redis客戶端 Redis-clie

2019-07-05 17:00:33

Redis數(shù)據(jù)庫(kù)可視化管理

2020-05-11 21:31:02

Redis 6.0緩存客戶端
點(diǎn)贊
收藏

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

亚洲久久一区二区| 精品入口麻豆88视频| 久久久久久久电影| 国产欧美日韩综合精品| 国产一级aa大片毛片| 国产99亚洲| 日韩欧美的一区| www.四虎成人| av在线免费网站| 91麻豆国产香蕉久久精品| 国产日韩欧美自拍| 97超碰人人干| 亚洲精品一区二区在线看| 亚洲激情小视频| 一区二区三区欧美精品| 伊人久久av| 亚洲第一在线| 日韩在线一区二区三区免费视频| 日韩高清一二三区| 成人av色网站| 欧美午夜宅男影院在线观看| 中文字幕日韩精品无码内射| 日本不卡免费播放| 成人性视频免费网站| 久久久精品国产一区二区| 天天躁日日躁狠狠躁av| 亚州精品国产| 在线欧美一区二区| 九九九九免费视频| 怡红院红怡院欧美aⅴ怡春院| 国产欧美久久久精品影院| 国产精品99久久久久久www| 免费人成在线观看| 成人线上播放| 在线成人小视频| 成人免费xxxxx在线视频| 福利成人导航| 有码一区二区三区| a级黄色片网站| 成年在线观看免费人视频| 99国内精品久久| 丁香五月网久久综合| 11024精品一区二区三区日韩| 久久精品日产第一区二区 | 亚洲激情av| 欧美成人全部免费| 老湿机69福利| 亚洲h色精品| 久久这里只有精品99| 成人三级视频在线观看| 日韩情爱电影在线观看| 日韩一区二区三区国产| 熟女少妇a性色生活片毛片| 青青草97国产精品麻豆| 中国人与牲禽动交精品| 国产毛片欧美毛片久久久| 国产99精品| 色多多国产成人永久免费网站| 久久久久无码精品国产sm果冻| 欧美人与拘性视交免费看| 亚洲天堂男人的天堂| 国产一二三四区在线| 日韩在线理论| 欧美成人精品不卡视频在线观看| 精品自拍偷拍视频| 欧美fxxxxxx另类| 久久久久久久影院| 亚洲日本韩国在线| 米奇777在线欧美播放| 国产成人亚洲精品| 国产精品伦一区二区三区| 国产精品一区二区久久不卡| 欧美激情在线观看视频| 国产乡下妇女做爰视频| 亚欧成人精品| 国产精品尤物福利片在线观看| 国产精品毛片一区二区在线看舒淇 | 日韩欧美影院| 欧美精品久久久久久久多人混战| 性欧美在线视频| 亚洲视频一起| 日韩精品中文字幕久久臀| 国产高清av片| 91精品啪在线观看国产手机 | 国产精品无码自拍| 久久97精品| 欧美一区二区三区视频免费| 一个人看的视频www| 国产精品超碰| 在线日韩欧美视频| 青青草手机在线观看| 在线午夜精品| 国产色综合天天综合网| 女人18毛片一区二区三区| 久久久久国色av免费看影院| 在线视频亚洲自拍| 国产精品电影| 亚洲午夜av在线| 欧美 激情 在线| **欧美日韩在线| 亚洲国产成人久久综合一区| 日本美女xxx| 欧美激情1区2区| 日本中文字幕成人| 午夜精品无码一区二区三区| 精品在线亚洲视频| 精品一区二区三区免费毛片| 在线免费观看黄| 亚洲成人动漫av| 亚洲图色中文字幕| 偷拍亚洲色图| 欧美极品少妇全裸体| 午夜久久久久久久久久影院| 国产成人精品免费网站| 视频一区二区三区免费观看| av2020不卡| 4hu四虎永久在线影院成人| 黑丝av在线播放| 欧美96在线丨欧| 国产日韩欧美视频在线| 免费在线一级视频| 国产午夜精品一区二区三区视频 | 久久国产精品99久久人人澡| 九九九九精品九九九九| 免费在线观看av电影| 欧美色男人天堂| 中文字幕一二三四区| 亚洲国内欧美| 高清不卡日本v二区在线| 欧美日韩视频在线播放| 在线观看日韩av先锋影音电影院| 日韩av无码一区二区三区不卡| 91精品啪在线观看国产18| 国产精品免费福利| 成人性生交大片免费看午夜| 欧美性猛交xxxxx水多| 黄色网址在线视频| 伊人影院久久| 国内成+人亚洲| 爱看av在线| 欧美va亚洲va| 好吊色视频在线观看| 国产综合色在线| 樱空桃在线播放| 精品精品导航| 日韩午夜电影av| 欧美又粗又大又长| 国产乱理伦片在线观看夜一区| 一区二区三区在线视频111| 99久久伊人| 中文字幕国内精品| 在线观看国产成人| 国产精品家庭影院| 中文字幕中文在线| 国产精品久久久久久久免费观看| 国产九九精品视频| 久久久久久国产精品免费无遮挡| 欧美日韩aaa| caoporn91| 成人激情综合网站| 色一情一乱一伦一区二区三区丨| 在线女人免费视频| 亚洲视频欧美视频| 中日精品一色哟哟| 亚洲欧洲日韩av| 日本少妇激三级做爰在线| 中文字幕一区二区三区在线视频| 亚洲自拍偷拍第一页| 国产区美女在线| 日韩av影视综合网| 啪啪小视频网站| 亚洲视频一区在线观看| japan高清日本乱xxxxx| 亚洲精品美女| 日韩欧美亚洲日产国| 91精品网站在线观看| 欧美激情视频三区| 欧美大片aaa| 欧美日本一道本在线视频| 国产黄在线免费观看| 99视频超级精品| 亚洲视频在线观看一区二区三区| 久久资源中文字幕| 国产精品免费一区二区| 成人性生活视频| 美女黄色丝袜一区| 涩涩视频在线观看免费| 欧美日韩一区二区三区高清 | 成人综合色站| 久久天堂av| 久久久久久999| av在线第一页| 精品av综合导航| 最近中文字幕免费在线观看| 亚洲免费观看在线视频| 亚洲av无码一区二区二三区| 久久9热精品视频| 国产淫片免费看| 亚洲欧洲美洲一区二区三区| 久久精品国产理论片免费| 日韩欧美三区| 欧美亚洲激情在线| 亚洲七七久久综合桃花剧情介绍| 亚洲欧美日韩国产中文| www精品国产| 欧美一a一片一级一片| 久久久久久蜜桃| 中文字幕不卡一区| 精品夜夜澡人妻无码av| 黑人巨大精品欧美一区| 波多野结衣家庭教师视频| 亚洲欧美在线专区| 亚洲精品成人三区| 亚州av日韩av| 国产传媒一区二区| 粉嫩一区二区三区在线观看| 国产成人在线播放| av电影在线免费| 欧美大片在线免费观看| 91在线直播| 亚洲视频在线播放| 香蕉av在线播放| 精品国产乱码久久久久久久 | 一级一片免费播放| 欧洲三级视频| 欧美理论一区二区| 久久精品色播| 国产精品久久久久久久小唯西川 | 欧美精品久久久久久久久老牛影院| 青青青国产在线| 久久久精品国产99久久精品芒果| 一级做a爱视频| 日本不卡不码高清免费观看 | 久久精品国产99| 中文字幕精品—区二区日日骚| 日日狠狠久久偷偷综合色| 懂色av一区二区三区在线播放| 91丨精品丨国产| 成人免费看吃奶视频网站| 992tv国产精品成人影院| 国产精品av在线播放| 在线观看爽视频| 欧美一二三视频| 人狥杂交一区欧美二区| 3344国产精品免费看| 欧美gv在线观看| 国产91免费看片| 激情开心成人网| 国产国产精品人在线视| 亚洲www啪成人一区二区| 国产精品xxx视频| 国产精品黄色片| 国产欧美日韩精品在线观看| 欧美不卡高清一区二区三区| 国产不卡av在线免费观看| 台湾成人免费视频| 国产狼人综合免费视频| 国产精品一区二区三区av| 91在线色戒在线| 成人高潮视频| 蜜桃导航-精品导航| 欧州一区二区| 裸体裸乳免费看| 亚洲一级一区| 国产又黄又猛视频| 老司机一区二区| 在线成人精品视频| 99视频在线观看一区三区| 欧美高清性xxxx| 日本一区二区三区国色天香| 国产又粗又长免费视频| 中文字幕在线观看不卡| 麻豆changesxxx国产| 亚州成人在线电影| 久久精品视频2| 日韩一级完整毛片| 深夜福利视频在线免费观看| 亚洲人成五月天| 黄色网页在线观看| 久久免费国产视频| 人人视频精品| 亚洲bt天天射| 亚洲成在人线免费观看| 日韩精品一区二区三区四区五区| 99久久综合狠狠综合久久aⅴ| 久久久久久www| 91久久国产| 超碰成人免费在线| 视频一区欧美精品| 三级黄色片免费观看| 99在线精品视频| 搜索黄色一级片| 丁香五六月婷婷久久激情| 久久免费精彩视频| 欧美性xxxx在线播放| 国产又大又长又粗| 精品小视频在线| 成人毛片av在线| 国产精品极品美女在线观看免费 | 波多野结衣精品| 成人www视频在线观看| 久久中文资源| 中文字幕一区二区三区四区五区人| 日韩视频一区| 手机在线观看日韩av| 国产调教视频一区| 国产无码精品视频| 欧美一区二区免费观在线| 免费在线看v| 97久久超碰福利国产精品…| 日韩精品一级毛片在线播放| 精品人伦一区二区三区| 正在播放日韩欧美一页 | 日韩制服诱惑| 国产区一区二区| 欧美福利影院| 制服丝袜中文字幕第一页| 久久久99久久精品欧美| 日本一级片免费看| 日韩欧美国产三级| 毛片在线播放a| 国产精品稀缺呦系列在线| 亚洲图片久久| a级黄色一级片| 久久精品天堂| www.17c.com喷水少妇| 亚洲欧美激情插| 伊人色综合久久久| 亚洲欧美综合图区| 亚洲福利影院| 久久av一区二区| 最新亚洲一区| 国产a√精品区二区三区四区| 国产传媒久久文化传媒| 中文字幕美女视频| 欧美日韩一二三区| 日本高清中文字幕在线| 国产精品久久久久久久久久尿| 日韩高清影视在线观看| 精品少妇人妻av免费久久洗澡| 国产成人综合在线| 黄色一级视频免费| 欧美v日韩v国产v| а√天堂中文在线资源8| 国产精品视频一区二区三区经| 欧美黄免费看| 图片区偷拍区小说区| 亚洲高清在线精品| 亚洲日本在线播放| 欧美专区日韩视频| 精品国产午夜| 污污动漫在线观看| 中文字幕中文乱码欧美一区二区| 在线亚洲欧美日韩| www.亚洲成人| 亚洲成人偷拍| a级黄色一级片| 久久综合色一综合色88| 亚洲精品成人在线视频| 国产亚洲激情视频在线| 国产亚洲精彩久久| 一区不卡字幕| 国产成人av一区二区三区在线 | 欧美日韩成人一区| 呦呦在线视频| 精品中文字幕一区| 日韩精品五月天| 天天操夜夜操av| 日韩精品一区二区三区视频在线观看 | 国产无色aaa| 亚洲一本大道在线| 欧洲一区av| 91精品综合视频| 中文日韩欧美| 中文字幕第69页| 精品不卡在线视频| jizz免费一区二区三区| 日韩不卡视频一区二区| 99国产精品国产精品毛片| 曰批又黄又爽免费视频| 色综合久久精品亚洲国产| 欧美亚洲国产日韩| 日韩欧美国产片| 精品成人av一区| 在线观看av黄网站永久| 成人深夜直播免费观看| 99在线精品视频在线观看| 貂蝉被到爽流白浆在线观看| 精品少妇一区二区三区视频免付费| 亚洲v.com| av日韩在线看| 国产精品视频你懂的| 丰满熟妇人妻中文字幕| 国产精品成人aaaaa网站| 精品动漫3d一区二区三区免费版| 久久精品视频18| 精品国产网站在线观看| 97久久精品午夜一区二区| 亚洲a一区二区三区| 亚洲精品乱码久久久久久久久久久久 |