精品欧美一区二区三区在线观看 _久久久久国色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)

久久成人福利| 精品欧美色视频网站在线观看| 99精品国产福利在线观看免费 | 欧美一区二区三区影院| 韩国日本一区| 久久久99精品久久| 成人精品在线观看| 日韩欧美中文字幕一区二区| 欧美亚洲在线日韩| 欧美本精品男人aⅴ天堂| 能在线观看的av| 麻豆av在线导航| 99精品视频一区二区三区| 国产免费一区二区三区在线能观看| 国产一区二区精彩视频| 蜜桃一区二区| 日韩美女视频在线| 亚欧美在线观看| 国产传媒在线观看| 亚洲激情网站免费观看| 日韩欧美视频一区二区| 亚洲风情第一页| 日韩av电影免费观看高清完整版| 久久久久亚洲精品国产| frxxee中国xxx麻豆hd| 亚洲精品无吗| 精品久久久久久久一区二区蜜臀| 香蕉视频禁止18| 女人让男人操自己视频在线观看| 亚洲女人的天堂| 日韩一区国产在线观看| 亚洲欧美日韩精品永久在线| 国产精品18久久久久久vr| 国产精品福利在线观看网址| 九九热在线免费观看| 欧美激情视频一区二区三区在线播放 | 欧美成在线观看| 黄色av片三级三级三级免费看| 欧美挤奶吃奶水xxxxx| 欧美大肚乱孕交hd孕妇| 色一情一区二区三区| 亚洲伦乱视频| 色美美综合视频| 国产成人精品视频免费看| 一级网站在线观看| caopo在线| 国产精品久久久久久久久免费丝袜 | 日本在线播放视频| 久久久久久美女精品| 中文字幕久久久av一区| 日韩一区二区a片免费观看| 人体久久天天| 日韩www在线| 800av在线播放| 波多野结衣在线一区二区 | 无码精品在线观看| 黄色免费在线看| 波多野结衣精品在线| 99在线首页视频| 精品人妻无码一区二区三区蜜桃一| 老色鬼精品视频在线观看播放| 国产精品高清免费在线观看| 国产又大又粗又爽| 日韩高清电影一区| 国产精品视频自拍| 国产精品毛片久久久久久久av | 国产精品久久中文| 艳妇乳肉豪妇荡乳av无码福利| av影片免费在线观看| 国产老肥熟一区二区三区| 91精品视频在线| 99热这里只有精品1| 国产乱码精品一品二品| 国产69精品久久久| 日本a级片在线观看| 嫩草研究院在线观看| 国产午夜精品在线观看| 亚洲欧洲精品一区二区三区波多野1战4 | 久久中文字幕免费| 日韩激情视频网站| 国产日韩在线亚洲字幕中文| 国产日韩精品suv| 国产91高潮流白浆在线麻豆| 国产一区二区三区黄| 男同在线观看| 综合亚洲深深色噜噜狠狠网站| 青春草在线视频免费观看| 国产高清在线a视频大全| 岛国精品视频在线播放| 国内自拍视频网| 亚洲一级大片| 亚洲香蕉av在线一区二区三区| 任你操精品视频| 伊人久久亚洲美女图片| 青青草一区二区| 91禁在线观看| 99久久免费视频.com| 五月天久久狠狠| 成人女同在线观看| 欧美色欧美亚洲另类二区| 国产成人精品一区二区在线小狼| 亚洲人成网亚洲欧洲无码| 久久人人爽人人爽人人片亚洲| 国产精品第108页| 免费成人在线视频观看| 国产精品麻豆免费版| 岛国视频免费在线观看| 一区二区三区不卡在线观看| 少妇性饥渴无码a区免费| 经典三级久久| 亚洲色图美腿丝袜| 国产一级性生活| 久久精品久久久精品美女| 国产日韩欧美一区二区| 成人午夜在线影视| 欧美亚洲动漫另类| 蜜桃精品成人影片| 激情综合视频| 成人精品一区二区三区电影免费| 九色在线免费| 欧美日韩国产色视频| 中文字幕第10页| 日韩在线精品| 国产精品成人一区| 欧美婷婷久久五月精品三区| 亚洲国产精品久久不卡毛片| 日韩欧美国产片| 国产99久久| 午夜免费在线观看精品视频| 99riav国产| 中文字幕亚洲成人| 五月婷婷深爱五月| 禁果av一区二区三区| 91精品国产91久久久久| 亚洲国产精品久久久久久久| 亚洲色大成网站www久久九九| 国产第一页视频| 精品影片在线观看的网站| 欧美激情综合色| 午夜精品久久久久久久爽| 综合色天天鬼久久鬼色| 欧美第一页浮力影院| 精品香蕉视频| 国产精品自拍小视频| 高清国产福利在线观看| 在线欧美日韩精品| av黄色免费网站| 蜜桃av综合| 免费成人在线观看av| 在线观看福利电影| 亚洲精选中文字幕| 区一区二在线观看| 久久精品网站免费观看| 日韩在线第三页| 欧美日韩精品在线一区| 国产精品老牛影院在线观看 | 久久精视频免费在线久久完整在线看| 国产天堂第一区| 国产精品国产三级国产aⅴ无密码| 污版视频在线观看| 久久久久久久久99精品大| 国产欧美精品xxxx另类| 黄色网页在线播放| 日韩欧美在线观看一区二区三区| 欧美在线视频第一页| 国产成人午夜精品5599| 精品少妇在线视频| 视频福利一区| 国产精品视频不卡| av网站大全在线| 精品剧情v国产在线观看在线| 国产精品30p| 久久久久久久久久久电影| 黄色片在线免费| 一区二区三区四区在线观看国产日韩 | 中文字幕日韩综合av| 国产免费黄色网址| 午夜精品成人在线视频| 亚洲精品一区二区三区影院忠贞| 美女视频免费一区| 久久精品无码中文字幕| 亚洲福利网站| 国产在线精品自拍| 69av成人| 中文字幕欧美日韩va免费视频| 国产精品女同一区二区| 亚洲第一精品在线| a资源在线观看| 成人午夜av在线| 美女网站免费观看视频| 自产国语精品视频| 免费h精品视频在线播放| 伊人久久大香| 欧美影院在线播放| 国产网站在线免费观看| 亚洲欧美999| a网站在线观看| 色婷婷香蕉在线一区二区| 老熟妻内射精品一区| 久久久久久久性| 免费看三级黄色片| 日本视频免费一区| 欧美a v在线播放| 伊人成综合网| 日本不卡二区| 国产精品高潮呻吟久久久久 | 澳门久久精品| 国产精品私拍pans大尺度在线 | 国户精品久久久久久久久久久不卡| 久久99精品久久久久久三级| 国产精品亚洲四区在线观看 | 国产精品久久久久久久久夜色| 亚洲丝袜另类动漫二区| 日本xxxxxxxxx18| a级高清视频欧美日韩| 一区二区久久精品| 日韩电影免费在线看| 黄色一级视频在线播放| 91精品天堂福利在线观看| 日韩精品极品视频在线观看免费| 国产成人精品福利| 亚洲一区二区久久久久久| av激情成人网| 日韩美女毛茸茸| 国产福利电影在线播放| 九九热最新视频//这里只有精品| 色多多视频在线观看| 亚洲欧美激情一区| 视频一区二区三区在线看免费看| 日韩欧美国产高清| 国产精品无码久久av| 欧美三级视频在线播放| 久久国产乱子伦精品| 日韩欧美国产视频| 91香蕉在线视频| 午夜久久久影院| 久久久久久久久久久97| 亚洲精品一二三区| 懂色av懂色av粉嫩av| 亚洲女人的天堂| 丁香花五月激情| 玉米视频成人免费看| 欧美日韩黄色网| 亚洲黄色av一区| 久久久久久久久久久久久久久久久 | 日韩电影大片中文字幕| 天堂av在线免费| 亚洲国内高清视频| 色综合视频在线| 亚洲国产精品视频在线观看| 乱精品一区字幕二区| 精品国产乱码久久| 人妻视频一区二区三区| 欧美精品一区二区蜜臀亚洲| 欧美77777| 国内精品久久国产| 成人av一区二区三区在线观看 | 中文字幕永久免费视频| 91国产免费看| 中文字幕乱码视频| 欧美日韩和欧美的一区二区| 中文字幕在线观看免费| 在线不卡一区二区| 国产免费无遮挡| 精品久久久久一区二区国产| 殴美一级特黄aaaaaa| 日韩av在线免费观看一区| 免费在线超碰| 中文字幕日韩专区| 性网站在线观看| 97在线视频免费| 欧美暴力调教| 91精品国产91久久久久青草| 国产精品chinese在线观看| 精品亚洲一区二区三区四区五区高| 亚洲系列另类av| 影音先锋亚洲视频| 黑丝一区二区三区| 美女福利视频在线| 久久国产夜色精品鲁鲁99| 久草福利在线观看| www激情久久| 你懂得在线观看| 亚洲国产精品久久不卡毛片| www.久久久久久久| 777a∨成人精品桃花网| 高h调教冰块play男男双性文| 亚洲美腿欧美激情另类| 免费高清完整在线观看| 久久欧美在线电影| 国产原创一区| 国产精华一区二区三区| 清纯唯美亚洲综合一区| 国产高清不卡无码视频| 视频在线观看一区| 91精品人妻一区二区三区蜜桃2| 久久综合av免费| www.色小姐com| 在线亚洲高清视频| 丰满少妇被猛烈进入| 中文字幕一区二区三区电影| 高清电影在线观看免费| 国产精品一区二区三区在线播放 | 中文字幕永久在线观看| 欧美第一区第二区| 在线免费观看黄色网址| 97婷婷大伊香蕉精品视频| 久久gogo国模啪啪裸体| 欧美一级片免费观看| 欧美久久综合| 15—17女人毛片| 91免费小视频| 久久久久无码精品国产| 欧美日韩午夜精品| 日韩专区一区二区| 欧美激情亚洲激情| 亚洲老司机网| 日韩一区二区三区高清| 国产毛片久久| 折磨小男生性器羞耻的故事| 中文字幕中文字幕在线一区| www.国产毛片| 亚洲精品xxxx| 爱情岛论坛亚洲品质自拍视频网站| 国产欧美一区二区三区四区| 蜜桃精品wwwmitaows| av动漫在线看| 成人av电影在线| 麻豆影视在线播放| 日韩一区二区三区观看| 日本在线播放| 国产免费一区二区三区在线能观看 | 青青草综合在线| 久久99国产精品免费网站| 精品无码在线观看| 日本久久电影网| 国产系列在线观看| 国产精品久久久久久超碰 | 成人黄色91| 大地资源第二页在线观看高清版| 日韩激情视频网站| 欧美激情 一区| 欧美日韩在线播放一区| 日本在线免费网| 91香蕉嫩草影院入口| 国产精品毛片久久| 欧美又黄又嫩大片a级| 亚洲色图制服丝袜| 国产女18毛片多18精品| 久久久精品视频在线观看| 福利一区三区| 成人污网站在线观看| 懂色av一区二区三区蜜臀| 国产乱码久久久久久| 亚洲国产精品成人va在线观看| 成年网站在线视频网站| 精品国产免费人成电影在线观...| 日韩视频一区| 日本少妇高潮喷水xxxxxxx| 色天天综合久久久久综合片| 东热在线免费视频| 成人有码在线播放| 国产精品www.| 亚洲一区二区乱码| 欧美综合天天夜夜久久| 欧美三级理伦电影| www.成人av| 久久xxxx精品视频| www中文在线| 日韩美女主播在线视频一区二区三区| 2020av在线| 神马影院我不卡午夜| 国产一区二区三区在线观看精品| 国产亚洲精久久久久久无码77777| 亚洲福利视频网站| 日本精品另类| 国产手机视频在线观看| 高清成人免费视频| 精品国产午夜福利| 色偷偷av一区二区三区乱| 在线综合色站| 人妻丰满熟妇av无码区app| 亚洲天堂精品视频| 日韩国产福利| 国产啪精品视频网站| 影音先锋日韩资源| 蜜桃传媒一区二区亚洲| 5566中文字幕一区二区电影| 国产在线观看www| 先锋影音亚洲资源| 国产激情视频一区二区三区欧美| 国产成人精品一区二三区| 少妇高潮久久77777| 精品日产乱码久久久久久仙踪林| 狠狠热免费视频| 亚洲一区二区三区四区在线免费观看 | 久久视频免费看| 在线观看久久av| 精品女人视频| 国产传媒免费观看|