国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

簡(jiǎn)單幾步,實(shí)現(xiàn) Redis 查詢 “附近的人”

共 22025字,需瀏覽 45分鐘

 ·

2022-12-22 12:25

大家好,我是寶哥

前言:針對(duì)“附近的人”這一位置服務(wù)領(lǐng)域的應(yīng)用場(chǎng)景,常見的可使用PG、MySQL和MongoDB等多種DB的空間索引進(jìn)行實(shí)現(xiàn)。而Redis另辟蹊徑,結(jié)合其有序隊(duì)列zset以及geohash編碼,實(shí)現(xiàn)了空間搜索功能,且擁有極高的運(yùn)行效率。

本文將從源碼角度對(duì)其算法原理進(jìn)行解析,并推算查詢時(shí)間復(fù)雜度。

要提供完整的“附近的人”服務(wù),最基本的是要實(shí)現(xiàn)“增”、“刪”、“查”的功能。以下將分別進(jìn)行介紹,其中會(huì)重點(diǎn)對(duì)查詢功能進(jìn)行解析。

操作命令

自Redis 3.2開始,Redis基于geohash和有序集合提供了地理位置相關(guān)功能。Redis Geo模塊包含了以下6個(gè)命令:

  • GEOADD: 將給定的位置對(duì)象(緯度、經(jīng)度、名字)添加到指定的key;
  • GEOPOS: 從key里面返回所有給定位置對(duì)象的位置(經(jīng)度和緯度);
  • GEODIST: 返回兩個(gè)給定位置之間的距離;
  • GEOHASH: 返回一個(gè)或多個(gè)位置對(duì)象的Geohash表示;
  • GEORADIUS: 以給定的經(jīng)緯度為中心,返回目標(biāo)集合中與中心的距離不超過給定最大距離的所有位置對(duì)象;
  • GEORADIUSBYMEMBER: 以給定的位置對(duì)象為中心,返回與其距離不超過給定最大距離的所有位置對(duì)象。

其中,組合使用GEOADD和GEORADIUS可實(shí)現(xiàn)“附近的人”中“增”和“查”的基本功能。

要實(shí)現(xiàn)微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。其中“給定的位置對(duì)象”即為用戶本人,搜索的對(duì)象為其他用戶。

不過本質(zhì)上,GEORADIUSBYMEMBER = GEOPOS + GEORADIUS,即先查找用戶位置再通過該位置搜索附近滿足位置相互距離條件的其他用戶對(duì)象。

以下會(huì)從源碼角度入手對(duì)GEOADD和GEORADIUS命令進(jìn)行分析,剖析其算法原理。

Redis geo操作中只包含了“增”和“查”的操作,并沒有專門的“刪除”命令。主要是因?yàn)镽edis內(nèi)部使用有序集合(zset)保存位置對(duì)象,可用zrem進(jìn)行刪除。

在Redis源碼geo.c的文件注釋中,只說明了該文件為GEOADD、GEORADIUS和GEORADIUSBYMEMBER的實(shí)現(xiàn)文件(其實(shí)在也實(shí)現(xiàn)了另三個(gè)命令)。從側(cè)面看出其他三個(gè)命令為輔助命令。

GEOADD

使用方式

GEOADD key longitude latitude member [longitude latitude member ...]

將給定的位置對(duì)象(緯度、經(jīng)度、名字)添加到指定的key。

其中,key為集合名稱,member為該經(jīng)緯度所對(duì)應(yīng)的對(duì)象。在實(shí)際運(yùn)用中,當(dāng)所需存儲(chǔ)的對(duì)象數(shù)量過多時(shí),可通過設(shè)置多key(如一個(gè)省一個(gè)key)的方式對(duì)對(duì)象集合變相做sharding,避免單集合數(shù)量過多。

成功插入后的返回值:

(integer) N

其中N為成功插入的個(gè)數(shù)。

源碼分析

/* GEOADD key long lat name [long2 lat2 name2 ... longN latN nameN] */
void geoaddCommand(client *c) {

//參數(shù)校驗(yàn)
    /* Check arguments number for sanity. */
    if ((c->argc - 2) % 3 != 0) {
        /* Need an odd number of arguments if we got this far... */
        addReplyError(c, "syntax error. Try GEOADD key [x1] [y1] [name1] "
                         "[x2] [y2] [name2] ... ");
        return;
    }

//參數(shù)提取Redis
    int elements = (c->argc - 2) / 3;
    int argc = 2+elements*2/* ZADD key score ele ... */
    robj **argv = zcalloc(argc*sizeof(robj*));
    argv[0] = createRawStringObject("zadd",4);
    argv[1] = c->argv[1]; /* key */
    incrRefCount(argv[1]);

//參數(shù)遍歷+轉(zhuǎn)換
    /* Create the argument vector to call ZADD in order to add all
     * the score,value pairs to the requested zset, where score is actually
     * an encoded version of lat,long. */

    int i;
    for (i = 0; i < elements; i++) {
        double xy[2];

    //提取經(jīng)緯度
        if (extractLongLatOrReply(c, (c->argv+2)+(i*3),xy) == C_ERR) {
            for (i = 0; i < argc; i++)
                if (argv[i]) decrRefCount(argv[i]);
            zfree(argv);
            return;
        }
    
    //將經(jīng)緯度轉(zhuǎn)換為52位的geohash作為分值 & 提取對(duì)象名稱
        /* Turn the coordinates into the score of the element. */
        GeoHashBits hash;
        geohashEncodeWGS84(xy[0], xy[1], GEO_STEP_MAX, &hash);
        GeoHashFix52Bits bits = geohashAlign52Bits(hash);
        robj *score = createObject(OBJ_STRING, sdsfromlonglong(bits));
        robj *val = c->argv[2 + i * 3 + 2];

    //設(shè)置有序集合的對(duì)象元素名稱和分值
        argv[2+i*2] = score;
        argv[3+i*2] = val;
        incrRefCount(val);
    }

//調(diào)用zadd命令,存儲(chǔ)轉(zhuǎn)化好的對(duì)象
    /* Finally call ZADD that will do the work for us. */
    replaceClientCommandVector(c,argc,argv);
    zaddCommand(c);
}

通過源碼分析可以看出Redis內(nèi)部使用有序集合(zset)保存位置對(duì)象,有序集合中每個(gè)元素都是一個(gè)帶位置的對(duì)象,元素的score值為其經(jīng)緯度對(duì)應(yīng)的52位的geohash值。

double類型精度為52位;
geohash是以base32的方式編碼,52bits最高可存儲(chǔ)10位geohash值,對(duì)應(yīng)地理區(qū)域大小為0.6*0.6米的格子。換句話說經(jīng)Redis geo轉(zhuǎn)換過的位置理論上會(huì)有約0.3*1.414=0.424米的誤差。

算法小結(jié)

簡(jiǎn)單總結(jié)下GEOADD命令都干了啥:
1、參數(shù)提取和校驗(yàn);
2、將入?yún)⒔?jīng)緯度轉(zhuǎn)換為52位的geohash值(score);
3、調(diào)用ZADD命令將member及其對(duì)應(yīng)的score存入集合key中。


GEORADIUS

使用方式

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count] [STORE key] [STORedisT key]

以給定的經(jīng)緯度為中心,返回目標(biāo)集合中與中心的距離不超過給定最大距離的所有位置對(duì)象。

范圍單位:m | km | ft | mi --> 米 | 千米 | 英尺 | 英里

額外參數(shù):

  • WITHDIST:在返回位置對(duì)象的同時(shí),將位置對(duì)象與中心之間的距離也一并返回。距離的單位和用戶給定的范圍單位保持一致。
  • WITHCOORD:將位置對(duì)象的經(jīng)度和維度也一并返回。
  • WITHHASH:以 52 位有符號(hào)整數(shù)的形式,返回位置對(duì)象經(jīng)過原始 geohash 編碼的有序集合分值。這個(gè)選項(xiàng)主要用于底層應(yīng)用或者調(diào)試,實(shí)際中的作用并不大。
  • ASC|DESC:從近到遠(yuǎn)返回位置對(duì)象元素 | 從遠(yuǎn)到近返回位置對(duì)象元素。- COUNT count:選取前N個(gè)匹配位置對(duì)象元素。(不設(shè)置則返回所有元素) - STORE key:將返回結(jié)果的地理位置信息保存到指定key。- STORedisT key:將返回結(jié)果離中心點(diǎn)的距離保存到指定key。

由于 STORE 和 STORedisT 兩個(gè)選項(xiàng)的存在,GEORADIUS 和 GEORADIUSBYMEMBER 命令在技術(shù)上會(huì)被標(biāo)記為寫入命令,從而只會(huì)查詢(寫入)主實(shí)例,QPS過高時(shí)容易造成主實(shí)例讀寫壓力過大。

為解決這個(gè)問題,在 Redis 3.2.10 和 Redis 4.0.0 中,分別新增了 GEORADIUS_RO 和 GEORADIUSBYMEMBER_RO兩個(gè)只讀命令。

不過,在實(shí)際開發(fā)中筆者發(fā)現(xiàn) 在java package Redis.clients.jedis.params.geo 的 GeoRadiusParam 參數(shù)類中并不包含 STORE 和 STORedisT 兩個(gè)參數(shù)選項(xiàng),在調(diào)用georadius時(shí)是否真的只查詢了主實(shí)例,還是進(jìn)行了只讀封裝。感興趣的朋友可以自己研究下。

成功查詢后的返回值:

不帶WITH限定,返回一個(gè)member list,如:

["member1","member2","member3"]

帶WITH限定,member list中每個(gè)member也是一個(gè)嵌套list,如:

[
 ["member1", distance1, [longitude1, latitude1]]
 ["member2", distance2, [longitude2, latitude2]]
]

源碼分析

此段源碼較長(zhǎng),看不下去的可直接看中文注釋,或直接跳到小結(jié)部分

/* GEORADIUS key x y radius unit [WITHDIST] [WITHHASH] [WITHCOORD] [ASC|DESC]
 *                               [COUNT count] [STORE key] [STORedisT key]
 * GEORADIUSBYMEMBER key member radius unit ... options ... */

void georadiusGeneric(client *c, int flags) {
    robj *key = c->argv[1];
    robj *storekey = NULL;
    int stoRedist = 0/* 0 for STORE, 1 for STORedisT. */

//根據(jù)key獲取有序集合
    robj *zobj = NULL;
    if ((zobj = lookupKeyReadOrReply(c, key, shared.null[c->resp])) == NULL ||
        checkType(c, zobj, OBJ_ZSET)) {
        return;
    }

//根據(jù)用戶輸入(經(jīng)緯度/member)確認(rèn)中心點(diǎn)經(jīng)緯度
    int base_args;
    double xy[2] = { 0 };
    if (flags & RADIUS_COORDS) {
  ……
    }

//獲取查詢范圍距離
    double radius_meters = 0, conversion = 1;
    if ((radius_meters = extractDistanceOrReply(c, c->argv + base_args - 2,
                                                &conversion)) < 0) {
        return;
    }

//獲取可選參數(shù) (withdist、withhash、withcoords、sort、count)
    int withdist = 0, withhash = 0, withcoords = 0;
    int sort = SORT_NONE;
    long long count = 0;
    if (c->argc > base_args) {
        ... ...
    }

//獲取 STORE 和 STORedisT 參數(shù)
    if (storekey && (withdist || withhash || withcoords)) {
        addReplyError(c,
            "STORE option in GEORADIUS is not compatible with "
            "WITHDIST, WITHHASH and WITHCOORDS options");
        return;
    }

//設(shè)定排序
    if (count != 0 && sort == SORT_NONE) sort = SORT_ASC;

//利用中心點(diǎn)和半徑計(jì)算目標(biāo)區(qū)域范圍
    GeoHashRadius georadius =
        geohashGetAreasByRadiusWGS84(xy[0], xy[1], radius_meters);

//對(duì)中心點(diǎn)及其周圍8個(gè)geohash網(wǎng)格區(qū)域進(jìn)行查找,找出范圍內(nèi)元素對(duì)象
    geoArray *ga = geoArrayCreate();
    membersOfAllNeighbors(zobj, georadius, xy[0], xy[1], radius_meters, ga);

//未匹配返空
    /* If no matching results, the user gets an empty reply. */
    if (ga->used == 0 && storekey == NULL) {
        addReplyNull(c);
        geoArrayFree(ga);
        return;
    }

//一些返回值的設(shè)定和返回
    ……
    geoArrayFree(ga);
}

上文代碼中最核心的步驟有兩個(gè),一是“計(jì)算中心點(diǎn)范圍”,二是“對(duì)中心點(diǎn)及其周圍8個(gè)geohash網(wǎng)格區(qū)域進(jìn)行查找”。

對(duì)應(yīng)的是geohashGetAreasByRadiusWGS84membersOfAllNeighbors兩個(gè)函數(shù)。

我們依次來看:

  • 計(jì)算中心點(diǎn)范圍:

// geohash_helper.c

GeoHashRadius geohashGetAreasByRadiusWGS84(double longitude, double latitude,
                                           double radius_meters)
 
{
    return geohashGetAreasByRadius(longitude, latitude, radius_meters);
}

//返回能夠覆蓋目標(biāo)區(qū)域范圍的9個(gè)geohashBox
GeoHashRadius geohashGetAreasByRadius(double longitude, double latitude, double radius_meters) {
//一些參數(shù)設(shè)置
    GeoHashRange long_range, lat_range;
    GeoHashRadius radius;
    GeoHashBits hash;
    GeoHashNeighbors neighbors;
    GeoHashArea area;
    double min_lon, max_lon, min_lat, max_lat;
    double bounds[4];
    int steps;

//計(jì)算目標(biāo)區(qū)域外接矩形的經(jīng)緯度范圍(目標(biāo)區(qū)域?yàn)椋阂阅繕?biāo)經(jīng)緯度為中心,半徑為指定距離的圓)
    geohashBoundingBox(longitude, latitude, radius_meters, bounds);
    min_lon = bounds[0];
    min_lat = bounds[1];
    max_lon = bounds[2];
    max_lat = bounds[3];

//根據(jù)目標(biāo)區(qū)域中心點(diǎn)緯度和半徑,計(jì)算帶查詢的9個(gè)搜索框的geohash精度(位)
//這里用到latitude主要是針對(duì)極地的情況對(duì)精度進(jìn)行了一些調(diào)整(緯度越高,位數(shù)越?。?/span>
    steps = geohashEstimateStepsByRadius(radius_meters,latitude);

//設(shè)置經(jīng)緯度最大最小值:-180<=longitude<=180, -85<=latitude<=85
    geohashGetCoordRange(&long_range,&lat_range);
    
//將待查經(jīng)緯度按指定精度(steps)編碼成geohash值
    geohashEncode(&long_range,&lat_range,longitude,latitude,steps,&hash);
    
//將geohash值在8個(gè)方向上進(jìn)行擴(kuò)充,確定周圍8個(gè)Box(neighbors)
    geohashNeighbors(&hash,&neighbors);
    
//根據(jù)hash值確定area經(jīng)緯度范圍
    geohashDecode(long_range,lat_range,hash,&area);

//一些特殊情況處理
    ……

//構(gòu)建并返回結(jié)果    
    radius.hash = hash;
    radius.neighbors = neighbors;
    radius.area = area;
    return radius;
}
  • 對(duì)中心點(diǎn)及其周圍8個(gè)geohash網(wǎng)格區(qū)域進(jìn)行查找:

// geo.c

//在9個(gè)hashBox中獲取想要的元素
int membersOfAllNeighbors(robj *zobj, GeoHashRadius n, double lon, double lat, double radius, geoArray *ga) {
    GeoHashBits neighbors[9];
    unsigned int i, count = 0, last_processed = 0;
    int debugmsg = 0;

//獲取9個(gè)搜索hashBox
    neighbors[0] = n.hash;
    ……
    neighbors[8] = n.neighbors.south_west;

//在每個(gè)hashBox中搜索目標(biāo)點(diǎn)
    for (i = 0; i < sizeof(neighbors) / sizeof(*neighbors); i++) {
        if (HASHISZERO(neighbors[i])) {
            if (debugmsg) D("neighbors[%d] is zero",i);
            continue;
        }

 //剔除可能的重復(fù)hashBox (搜索半徑>5000KM時(shí)可能出現(xiàn))
        if (last_processed &&
            neighbors[i].bits == neighbors[last_processed].bits &&
            neighbors[i].step == neighbors[last_processed].step)
        {
            continue;
        }

 //搜索hashBox中滿足條件的對(duì)象    
        count += membersOfGeoHashBox(zobj, neighbors[i], ga, lon, lat, radius);
        last_processed = i;
    }
    return count;
}


int membersOfGeoHashBox(robj *zobj, GeoHashBits hash, geoArray *ga, double lon, double lat, double radius) {
//獲取hashBox內(nèi)的最大、最小geohash值(52位)
    GeoHashFix52Bits min, max;
    scoresOfGeoHashBox(hash,&min,&max);

//根據(jù)最大、最小geohash值篩選zobj集合中滿足條件的點(diǎn)
    return geoGetPointsInRange(zobj, min, max, lon, lat, radius, ga);
}


int geoGetPointsInRange(robj *zobj, double min, double max, double lon, double lat, double radius, geoArray *ga) {

//搜索Range的參數(shù)邊界設(shè)置(即9個(gè)hashBox其中一個(gè)的邊界范圍)
    zrangespec range = { .min = min, .max = max, .minex = 0, .maxex = 1 };
    size_t origincount = ga->used;
    sds member;

//搜索集合zobj可能有ZIPLIST和SKIPLIST兩種編碼方式,這里以SKIPLIST為例,邏輯是一樣的
    if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
        ……
    } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
        zset *zs = zobj->ptr;
        zskiplist *zsl = zs->zsl;
        zskiplistNode *ln;

 //獲取在hashBox范圍內(nèi)的首個(gè)元素(跳表數(shù)據(jù)結(jié)構(gòu),效率可比擬于二叉查找樹),沒有則返0
        if ((ln = zslFirstInRange(zsl, &range)) == NULL) {
            /* Nothing exists starting at our min.  No results. */
            return 0;
        }

 //從首個(gè)元素開始遍歷集合
        while (ln) {
            sds ele = ln->ele;
  //遍歷元素超出range范圍則break
            /* Abort when the node is no longer in range. */
            if (!zslValueLteMax(ln->score, &range))
                break;
  //元素校驗(yàn)(計(jì)算元素與中心點(diǎn)的距離)
            ele = sdsdup(ele);
            if (geoAppendIfWithinRadius(ga,lon,lat,radius,ln->score,ele)
                == C_ERR) sdsfree(ele);
            ln = ln->level[0].forward;
        }
    }
    return ga->used - origincount;
}

int geoAppendIfWithinRadius(geoArray *ga, double lon, double lat, double radius, double score, sds member) {
    double distance, xy[2];

//解碼錯(cuò)誤, 返回error
    if (!decodeGeohash(score,xy)) return C_ERR; /* Can't decode. */

//最終距離校驗(yàn)(計(jì)算球面距離distance看是否小于radius)
    if (!geohashGetDistanceIfInRadiusWGS84(lon,lat, xy[0], xy[1],
                                           radius, &distance))
    {
        return C_ERR;
    }

//構(gòu)建并返回滿足條件的元素
    geoPoint *gp = geoArrayAppend(ga);
    gp->longitude = xy[0];
    gp->latitude = xy[1];
    gp->dist = distance;
    gp->member = member;
    gp->score = score;
    return C_OK;
}

算法小結(jié)

拋開眾多可選參數(shù)不談,簡(jiǎn)單總結(jié)下GEORADIUS命令是怎么利用geohash獲取目標(biāo)位置對(duì)象的:

1、參數(shù)提取和校驗(yàn);

2、利用中心點(diǎn)和輸入半徑計(jì)算待查區(qū)域范圍。這個(gè)范圍參數(shù)包括滿足條件的最高的geohash網(wǎng)格等級(jí)(精度) 以及 對(duì)應(yīng)的能夠覆蓋目標(biāo)區(qū)域的九宮格位置;(后續(xù)會(huì)有詳細(xì)說明)

3、對(duì)九宮格進(jìn)行遍歷,根據(jù)每個(gè)geohash網(wǎng)格的范圍框選出位置對(duì)象。進(jìn)一步找出與中心點(diǎn)距離小于輸入半徑的對(duì)象,進(jìn)行返回。

直接描述不太好理解,我們通過如下兩張圖在對(duì)算法進(jìn)行簡(jiǎn)單的演示:

圖片
圖片

令左圖的中心為搜索中心,綠色圓形區(qū)域?yàn)槟繕?biāo)區(qū)域,所有點(diǎn)為待搜索的位置對(duì)象,紅色點(diǎn)則為滿足條件的位置對(duì)象。

在實(shí)際搜索時(shí),首先會(huì)根據(jù)搜索半徑計(jì)算geohash網(wǎng)格等級(jí)(即右圖中網(wǎng)格大小等級(jí)),并確定九宮格位置(即紅色九宮格位置信息);再依次查找計(jì)算九宮格中的點(diǎn)(藍(lán)點(diǎn)和紅點(diǎn))與中心點(diǎn)的距離,最終篩選出距離范圍內(nèi)的點(diǎn)(紅點(diǎn))。

算法分析

為什么要用這種算法策略進(jìn)行查詢,或者說這種策略的優(yōu)勢(shì)在哪,讓我們以問答的方式進(jìn)行分析說明。

為什么要找到滿足條件的最高的geohash網(wǎng)格等級(jí)?為什么用九宮格?

這其實(shí)是一個(gè)問題,本質(zhì)上是對(duì)所有的元素對(duì)象進(jìn)行了一次初步篩選。 在多層geohash網(wǎng)格中,每個(gè)低等級(jí)的geohash網(wǎng)格都是由4個(gè)高一級(jí)的網(wǎng)格拼接而成(如圖)。

圖片

換句話說,geohash網(wǎng)格等級(jí)越高,所覆蓋的地理位置范圍就越小。當(dāng)我們根據(jù)輸入半徑和中心點(diǎn)位置計(jì)算出的能夠覆蓋目標(biāo)區(qū)域的最高等級(jí)的九宮格(網(wǎng)格)時(shí),就已經(jīng)對(duì)九宮格外的元素進(jìn)行了篩除。

這里之所以使用九宮格,而不用單個(gè)網(wǎng)格,主要原因還是為了避免邊界情況,盡可能縮小查詢區(qū)域范圍。試想以0經(jīng)緯度為中心,就算查1米范圍,單個(gè)網(wǎng)格覆蓋的話也得查整個(gè)地球區(qū)域。而向四周八個(gè)方向擴(kuò)展一圈可有效避免這個(gè)問題。

如何通過geohash網(wǎng)格的范圍框選出元素對(duì)象?效率如何?

首先在每個(gè)geohash網(wǎng)格中的geohash值都是連續(xù)的,有固定范圍。所以只要找出有序集合中,處在該范圍的位置對(duì)象即可。以下是有序集合的跳表數(shù)據(jù)結(jié)構(gòu):

圖片

其擁有類似二叉查找樹的查詢效率,操作平均時(shí)間復(fù)雜性為O(log(N))。且最底層的所有元素都以鏈表的形式按序排列。

所以在查詢時(shí),只要找到集合中處在目標(biāo)geohash網(wǎng)格中的第一個(gè)值,后續(xù)依次對(duì)比即可,不用多次查找。

九宮格不能一起查,要一個(gè)個(gè)遍歷的原因也在于九宮格各網(wǎng)格對(duì)應(yīng)的geohash值不具有連續(xù)性。只有連續(xù)了,查詢效率才會(huì)高,不然要多做許多距離運(yùn)算。

綜上,我們從源碼角度解析了Redis Geo模塊中 “增(GEOADD)” 和 “查(GEORADIUS)” 的詳細(xì)過程。并可推算出Redis中GEORADIUS查找附近的人功能,時(shí)間復(fù)雜度為:O(N+log(M))

其中N為指定半徑范圍內(nèi)的位置元素?cái)?shù)量,而M則是被九宮格圈住計(jì)算距離的元素的數(shù)量。結(jié)合Redis本身基于內(nèi)存的存儲(chǔ)特性,在實(shí)際使用過程中有非常高的運(yùn)行效率。

來源:juejin.cn/post/6844903966061363207

往期推薦:

這是我見過最好的微服務(wù) SaaS 快速開發(fā)平臺(tái)。功能完整,代碼結(jié)構(gòu)清晰!

Spring Boot + Redis 實(shí)現(xiàn) API 接口防刷限流

牛逼貨!一分鐘安裝部署一套您自己的堡壘機(jī)系統(tǒng),而且還開源了!

SpringBoot 項(xiàng)目打成 .exe 程序,實(shí)戰(zhàn)來了,超級(jí)詳細(xì)!

瀏覽 50
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 国产A视频| 佐山爱人妻无码蜜桃| 免费Av网站| 青娱乐成人电影| 曰韩一级A片| 黄色色情小说| 成人在线免费视频| 免费无码高清视频| 国产高清Av| 天天综合7799| 天天天天天天天天操| 大香蕉做爱视频| 黄色视频网站在线| 91青青草视频| 国产成人免费视频在线| 天天日天天干美女| 色综合九九| 成人特级毛片全部免费播放| 大地影视中文第三页最新在线观看| 日韩乱伦网站| 日本www视频| 午夜操日在线| 欧美三级黄色| 性爱AV天堂| 91妻人人澡人人爽人人精品| 8x8拨牐拨牐拨牐永久免费| 97资源网站| 影音先锋av在线资源站| 久久青青| 日韩在线视频观看| 韩日在线| 尤物AV| 美日韩无码视频| 国产一级黄色A片| 国产激倩都市一区二区三区欧美 | 天堂色综合| 亚洲中文AV在线| 亚洲69| 91国产视频在线观看| 伊人在线视频观看| 大香蕉做爱视频| 精品操逼视频| 露脸丨91丨九色露脸| 最好看的MV中文字幕国语| 国产精品夜夜爽7777777| 成年人免费网站| 国产又爽又黄视频| 亚洲视频在线观看| 国产自偷自拍| 日韩三级在线| 婷婷久久综| 丰满人妻精品一区二区在线 | 麻豆免费成人视频| 国产精品在线观看视频| 久草视频大香蕉| 久久中文娱乐网| 精品一区三区| 精品国产乱码| 91老熟女| 人人妻人人澡人人爽人人欧美一区| 91人妻无码精品蜜桃| 精品黄色片| 91超碰免费在线| 黄色av免费在线| 狠狠做深爱婷婷久久综合一区 | 天天爽夜夜爽夜夜爽精品| 18禁网站在线播放| 日日夜夜天天综合| 黄色污污污网站| 蜜臀99| 曰本精品综合网在线| 中文字幕无码视频| 91无码人妻| 天天爽日日澡AAAA片| 日韩人妻一区二区三区| 日本免费中文字幕| 国产伦乱| 人人操人人干人人摸| 国产精品三级在线观看| 年轻女教师高潮2| 午夜无码久久| 1024手机在线视频| 国产在线内射| 国产免看一级a一片成人aⅴ| 人妻三级| 伊人综合久久| 亚洲国产成人在线| 亚洲黄色无码视频| 久久亚洲中文| 日本中出视频| 日韩在线视频网| 亚洲青草视频| 韩日黄色| 一级黄色视频日逼片| 高清无码学生妹| 国产香蕉视屏| 曰本精品综合网在线| 靠比免费| 男同人到爽无套狂欢| 中文字幕在线观看完整av| 久久草成人网| 国产高清Av| 黄色成人网站在线播放| 日韩视频精品| 中日韩在线视频| 人妻无码电影推荐| 久草热在线| 一区二区三区在线免费观看| 成人欧美大片黄18| 中文字幕AV在线观看| 特级无码| 亚洲av观看| 九九九精彩视频| 久久精品三级片| 久久亚洲天堂| 在线中文字幕网站| 成人三区| 三级片国产| 日韩东京热中文字幕| www.色999| 亚洲天堂人妻少妇| 蜜桃精品久久久| 欧美后门菊门交| 波多野结衣亚洲无码| 国产毛片在线看| 国产成人免费在线观看| 久久精品视频在线观看| 有码中文字幕| 大香蕉99| AV三级无码| 在线啪| 亚洲一本色道中文无码| 日本大香蕉在线视频| 婷婷在线影院| 亚洲天堂一区在线观看| 国产黄片一区二区| 国产精品自拍三级| 麻豆久久久久| 日韩AV免费在线| 三级成人无码| 精品国产无码怀孕| 污网站在线观看| 天天色免费视频| 中文字幕高清免费看| 欧美亚洲黄色| 亚洲码AV波多野| 99re88| 嫩BBB槡BBBB槡BBBB百度| 欧美操逼在线| 欧美激情在线观看| 亚洲一级黄色视频| 日韩av一区二区三区| 欧美成人激情| 久久AV电影| 国精产品秘一区二区| 91麻豆天美传媒在线| 日本三级片中文字幕| 玖玖爱综合| 88无码| 高清无码免费看| 亚洲人妻一区二区| 99久久久久久| 国产视频导航| 欧美日p| 91在线无码视频| 欧美特级黄| 免费无码网站| 日本综合色| 东京热在线免费观看| 毛片网站在线| 久久久三级片| 波多野结衣vs黑人巨大| 黄片网站入口| 久久熟妇| 911精品国产一区二区在线| 99久久精品国产精品有折扣吗 | 在线观看18s| 在线免费看黄网站| 亚洲制服在线观看| 人妻互换一二三区免费| 久久九九99| 天堂vs亚洲| 天天日天天噜| 12—13女人毛片毛片| 国产精品免费一区二区三区都可以 | 国内老熟妇对白XXXXHD| 后入少妇视频| 欧美+日产+中文| 国产a精品| 日皮视频在线| 中文字幕在线观看AV| 成人超碰在线| 婷婷五月天在线电影| 91蝌蚪在线视频| 国产A片网站| 久肏| 天天干天天射天天操| 日韩三级AV在线观看| 91久久久久久久久久久| 老司机午夜视频| 99热在线观看免费精品| 91网站在线看| 电影豹妹香港版| 最好看2019中文在线播放电影| 九九九视频在线观看| 成人久久久久一级大黄毛片中国 | 国产AV久久| 国语对白做受欧美| 999reav| 天天操人人爽| 亚洲AV无码成人专区| 91亚洲国产AⅤ精品一区二区| 亚洲成人高清无码| 麻豆91免费视频| 99久久亚洲精品日本无码| 欧美一区三区| 中文字幕人妻丰满熟妇| 色男人的天堂| 思思热在线视频播放| 日本A片免费| 簧片网站在线观看| 苍井空无码| 婷婷手机在线| 国产一区久久| 亚洲黄片大全| 成人啪啪视频| 91国产视频在线播放| 香蕉在线观看| 一级黄色毛片视频| 天天拍夜夜操| 亚洲国产成人在线| 这里只有精品视频在线| 日韩国产一区二区| 国产福利视频在线| 日本性爱网址| 99色在线视频| 国产黄色视频在线免费观看| 欧美日韩在线电影| 国产黄色在线视频| 久久久久久成人无码| 国产色色视频| 天天骑夜夜操| 日本熟女视频| 日韩欧美大香蕉| 9l视频自拍蝌蚪9l成人| 无码人妻丰满熟妇区毛片视频| 中文字幕免费久久| 久久青娱乐| 翔田千里无码破解| 免费黄片视频| 91丨九色丨蝌蚪丨对白| 黄色三级电影| 超碰首页| 午夜日韩乱伦| 国产视频入口| 蜜臀久久久久久999| 久久R5| 人人妻人人操人人干| Japanese在线观看| 五月天激情婷婷| 成人亚洲天堂| 丰满人妻一区二区三区免费| 无码人妻一区二区一牛影视| 国产成人精品a区在线观看 | 91人妻人人澡人人爽人人精品乱| 69久久| 精品玖玖| 这里只有精品久久| 欧美精产国品一二三区| 不卡无码免费视频| 欧美成人内射| 日日碰狠狠| 影音先锋色色| 亚洲视频一区二区三区四区娇小视频在线观看视频 | 日韩三级中文| 特黄AAAAAAAAA真人毛片| 成人第一页| 亚洲中文自拍| 成人理伦A级A片在线论坛| 久热精品在线观看| 五月激情黄色| 亚洲人成人无码一区二区三区| 91在线无码精品秘入口动作| 欧美在线va| 可以在线观看的AV| 黄色精品视频| 色视频网| 亚洲欧洲成人在线| 人人操AV在线| 天天精品视频| 在线超碰| 四川揉BBB搡BBB| 91av免费在线观看| 日韩91| 亚洲高清无码一区二区| av天堂中文在线| 91中文字幕| 特一级A片| 色婷婷AV一区二区三区软件| 国产精品久久久久久久久A| 国产不卡在线视频| 国产精品成人无码免费| 天天干狠狠| 老女人日逼视频| 久久无码电影| 亚洲免费黄色片| 美女综合网| 久久久精品久久| 色情一级AA片免费观看| 大香蕉视频在线观看| 欧美日韩性色无码免费| 日韩综合另类| 国产Av大全| 国产精品91在线| 国产黄色免费网站| 欧美成人国产| 色午夜| 一级片黄色免费| 成人网站三级片| 国产成人片| 日韩专区中文字幕| 九九热在线观看| 日本AⅤ中文字幕| 人人操综合| 亚洲视频日韩在线观看| 免费观看在线无码视频| 500部大龄熟乱4K视频| 操逼视频免费看| 成人H动漫精品一区二区无码| 国产综合精品久久久久成人AV| 久久无码影院| 婷婷五月天色色| 日逼视频| 日韩中出视频| 91香蕉视频18| 5D肉蒲团| 亚洲日韩精品中文字幕在线| 强伦人妻一区二区三区视频| 亚洲免费播放| 97人妻一区二区精品免费视频| 欧美性综合| 亚洲高清无码免费在线观看| 欧美VA视频| 淫乱人妻| 无码草逼| 伊人精品视频| 超碰2021| eeuss一区| 国产尤物在线观看| 亚洲AV高清无码| 无码国产99精品久久久久网站| a免费视频| 91精品视频在线免费观看| 日韩人妻一区二区三区| 日韩无码一二三区| 免费看黄色大片| 啊啊啊啊啊靠逼| 日韩一级二级| 国产香蕉在线视频| 大鸡巴午夜爽视频电影| 国内精品一区二区三区| 蜜桃影视| 亚洲中文婷婷| 国产乱子伦-区二区| 免费无码进口视频| 欧美a片在线看| 亚洲无码AV电影| 国产又爽又黄视频在线看| 国产三级无码| 国产午夜精品一区二区三区牛牛| 大香蕉电影网| 丝袜一区| 亚洲AV色香蕉一区二区三区 | 成人片网址| www.毛片| 久热国产视频| 青青草小视频| 黄色视频小说| 久久久久久三级电影| 欧美精品日韩| 五月天婷婷在线观看| 黄色大片在线播放| 中文字幕在线视频观看| 亚洲狼友视频| 久久视频一二| 日韩欧美分区视频| 豆花成人网站在线看| 日本色色视频| 国产网站免费| 无码人妻日韩精品一区二区三 | 日韩AV中文| 一道本不卡视频| 无码精品一区二区| 麻豆一区在线| 精品乱伦| 在线看片A| 日韩黄色视频在线观看| 日韩欧美亚洲| 亚洲福利免费观看| 中文字幕乱码亚洲中文在线| 成人在线A片| 97色色婷婷五月天| 亚洲精品资源| 操B电影| 久久人妻免费视频| 丁香婷婷视频| 99热这里只有精品999| 成人自拍偷拍视频| 国产无遮挡又黄又爽又色| 免费观看高清无码视频| 青青草免费在线| 国产资源AV| 大香蕉啪啪啪| 欧美成人视屏| 日日干网| 国产精品无码一区二区三区免费| 一插综合网| 最好看2019中文在线播放电影| 亚洲成人网站在线| AV无码免费| 亚洲香蕉av| www.一区二区三区| 亚洲黄色一级电影| 影音先锋av在线资源站| 伊人久久爱| 五月丁香激情在线| 亚洲午夜久久久久久久久久久| 久久精品91| 日本日逼网| 97无码视频| 懂色av蜜臀av粉嫩av分享| 日韩72页| 91免费视频网站| 特级西西444www大精品| 不卡无码av| 中文字字幕在线中文乱码电影| 日韩欧美国产精品综合嫩V| 学生妹作爱片| 国产性爱av| 无码精品成人观看A片| 思思热99热| 亚洲av观看| 做爰视频毛片下载蜜桃视频 | 午夜福利电影AV| 中文字幕高清在线中文字幕中文字幕 | 无码午夜| 亚洲欧美日韩色图| 亚洲无码高清免费| 国产小视频在线观看| 亚洲爱爱网| 先锋影音成人资源| 亚洲精品视频在线观看网站| 波多野成人无码精品视频| 蜜臀久久99精品| 国产精品久久久久久久免牛肉蒲| 亚洲视频国产| 人人干国产| 国产免费高清无码| 中文字幕免费在线| 亚洲va欧洲va国产va不卡| 热久久最新| 三级片国产| 做爱无码| 色小说在线| 丁香伊人| 97超碰碰| 亚洲AV无码乱码国产精品蜜芽| 在线播放高清无码| 欧美一级黄色性爱视频| 中文字幕在线不卡| 偷拍视频第一页| 亚洲黄色av网站| 波多野结衣性爱视频| 综合色婷婷| 黄色免费av| 丁香五月一区二区| 日韩欧美高清视频| 又大又黄又爽| 伊人久久成人| 久久无码影视| 狠狠网| aa久久| 久草视频这里只有精品| 特级特黄A级高潮播放| 久久不卡| 18禁一区| 韩国免费一级a一片在线播放| 久久久无码人妻精品无码| 日本18禁网站| 日本激情视频| 四川美人搡BBw搡BBw| 9l视频自拍蝌蚪9l视频成人| 高清无码免费在线观看| 亚洲最大的成人网站| 免费看黄色视频的网站| 日本久久不卡| 亚洲三级视频| 四虎884| 中文字幕熟女| 就爱av| 伊人五月婷婷| 日本欧美在线| 99久久久国产精品无码| 国产女人18毛片水真多成人如厕| 2019中文字幕mv第三季歌词| 毛片毛片毛片| 亚洲AV男人天堂| 欧美日韩亚洲视频| 热九九精品| 91色视频在线观看| 国产熟妇| 国产成人无码永久免费| 久操亚洲| 日韩中文字幕在线高清| 看国产毛片| 一级爱爱| 欧美精品久久久久| 欧美性爱怡红院| 蜜芽视频| 日韩成人无码片| 一级免费毛片| 欧美sese| 中日韩在线| 俺也来最新色视频| 青青草国产在线视频| 99热最新| 三级小说| 日本伊人大香蕉| 91成人网站| 一起操影院| 亚洲国产精品一区二区三区| 成人超碰在线| 亚洲综合91| 久久久久久综合| 秋霞福利影院| 免费A片在线| 在线观看黄a| 性色网站| 欧美性猛交XXXX乱大交3| 91黄色在线观看| 影音先锋男人资源网| 91人人妻人人| 五月天无码av| 欧美三级视频| 自拍偷拍综合| 丁香五月色情| 亚洲精品久久久久avwww潮水 | 性爱免费视频网站| 三级毛片网站| 91国产视频在线播放| 国产欧美一区二区精品性色超碰| 一区二区三区四区免费| 亚人精品中文字幕在线观看| 天天中文字幕| 日韩国产传媒| 中国免费毛片| 欧美美女日逼视频| 亚洲综合五月天婷婷丁香| 国产一区二区AV| 亚洲日韩一级片| www九九热| 亚洲精品国产AV婷婷| 久草大香蕉在线| 国产成人A∨| 国产18欠欠欠一区二区| 亚洲色视频| 五月伊人网| 日本成人精品| 狠狠色狠狠干| 狠狠干狠狠爱| 午夜黄色视频在线观看| 国产精品人人| 黄色网址在线观看视频| 日韩在线观看AV| 国产性爱网站| 久久ww| 欧美A√| 麻豆免费成人视频| 一区二区三区四区视频在线| 黑人精品欧美一区二区蜜桃| 久久久久久9| 国产高清AV在线| 久久露脸国语精品国产91| aaa免费| 看国产AA免费| 国产AV大全| 黑人毛片| 青草精品视频| 欧美成人黄色| 欧美又大又粗| 围产精品久久久久久久| 无码区一区二区| 天天插天天拍| 亚洲美女网站免费观看网址| 久久综合伊人7777777| 日韩老熟妇| 国产香蕉视屏| 亚洲无码人妻| 日本人妻A片成人免费看片| 国产高清精品软件丝瓜软件| 岛国AV免费看| 亚洲图片一区| 乱伦网址| 97人妻天天摸天天爽天天| 丁香五月婷婷久久| 久久婷婷国产综合| 黄色成人免费视频| 天天草天天草| 99热一区二区三区| 国产波霸爆乳一区二区| 久久久久亚洲AV成人片乱码| 插吧插吧综合网| 国产91在线中日| 中文字幕你懂的在线三级| 伊人大香蕉视频| 亚洲三级网站| 亚洲操| 色情五月| 1024在线视频| 亚洲视频在线看| 在线观看黄色电影| 91人妻人人澡人人爽人人| av香蕉| 北京熟妇槡BBBB槡BBBB| 日批国产| 国产美女av| 国产美女啪啪视频| 91农村站街老熟女露脸| 国产一区二区三区四区五区在线| 老熟女91| 婷婷精品在线视频| 亚洲成人视频在线免费观看| 柠檬AV导航| 一本无码中文字幕| 蜜桃传媒视频| 三级网站视频| 黑人精品| 成人小视频在线| 日韩欧美在线中文字幕| 欧美一本在线| 成人视频18+在线观看| 日本在线一区二区| 永久久久久久久| 在线天堂999| 自拍视频国产| 国产家庭乱伦| 高清无码免费不卡| 一区在线免费观看| 不卡视频一区二区三区| 97AV人妻无码视频二区| 超碰免费91| 日韩在线视频中文字幕码无| 国产乱伦内射| 美女掰穴| 日韩成人无码专区| 嫩草视频在线观看| 无码成人午夜在线影院| 亚洲制服在线观看| 北条麻妃99| 在线观看视频91| 五月丁香大香蕉| 99成人国产精品视频| 亚洲艹逼| 在线观看污视频| 亚州成熟少妇视频在线观看| 欧美激情一区| 黄色视频日本| 日韩综合色视频导航| 中文字幕永久在线5| 手机AV网站| 美日韩A片| 91大熟女91大腚女人| 一本大道久久久久| 亚洲无码人妻在线| 日本国产在线视频| 在线播放国产精品| 欧美熟妇BBB搡BBB| 99热这里只有精| 欧美激情另类| 婷婷五月丁香花| 成人久久视频| 欧美三级片网址| 丰滿老婦BBwBBwBBw| 国产精品福利在线| 永井玛丽亚av无码中出流出| 日本无码久久嗯啊流水| 欧美熟女一区二区| 成年人免费看视频| 久久久久一区二区三区| 亚洲天天在线| 中文字幕日韩亚洲| 成人精品一区二区区别解析| 91福利在线视频| 91精品大屁股白浆自慰久久久| 成人无码动漫A片| 久草视频网站| 国产熟妇搡BBBB搡BBBB毛片| 国产免费视频69| 黄色带亚州| 国产人妻人伦精品1国产丝袜| 成年片免费观看网站免费观看,亚洲+欧... | av老鸭窝| 99久久国产精| 在线观看内射视频| 无码人妻精品一区| 国产精品视频免费看| 国产精品美女毛片真酒店| 91嫖妓站街按摩店老熟女| 午夜精品视频| 婷婷深爱五月丁香网| 人人爱人人操人人爽| 11一12周岁女毛片| 特一级黄片| 天天爽天天爽成人A片影院| 精品国产黄色| www.国产视频| 欧美三级片在线播放| 自慰喷水流白浆中文字幕| 国产美女操逼网站| 亚洲激情欧美激情| 在线观看精品视频| 乱子伦毛片国产| 大香蕉国产精品视频| 欧美一级黄色A片| 久久99深爱久久99精品| 国产成人精品视频| 伊人色色综合| 国产无码电影网| 亚洲无码视频在线免费观看| 日韩视频区| 亚洲制服在线观看| 超碰91在线观看| 婷婷激情综合| 影音av在线| 涩涩视频成人| 人人人人人人人人操| 天天操天天操天天操天天操| 久久久久久久久国产| 黄色亚洲| a网站免费观看| 精品一区二区三区av| 欧美色图狠狠干| 夜夜骚av.一区二区三区四区| 精品无码一区二区三区的天堂| 中文字幕观看在线| 18禁www| 初学影院WWWBD英语完整版在线观看 | 五月丁香啪啪啪| 日韩91在线视频| 偷拍视频图片综合网| 少妇搡BBBB搡BBB搡造水多/| 无码AV中文字幕| 韩国无码免费| 日韩群交| 手机在线看片av| 免费无码婬片aaaa| 91无码秘蜜桃一区二区三区-百度| 国产又爽又黄在线看| 欧美日韩黄| 亚洲vs天堂vs成人vs无码| 在线观看免费黄视频| 国产口爆视频| 国产精品视频网站| 中文在线字幕电视剧免费平台| 91久久精品无码一区二区三区| 黄色成人视频网站| 日日骚影院| 蜜桃视频在线观看视频| 国产精品成人无码a无码| 欧美三级| 亚洲AV无码日韩AV无码导航| 国产无码做爱视频| 欧美亚洲成人视频| 国产成人无码区免费AV片在线 | 天天看A片| 天天日天天干天天干| 欧美激情一区| 无码精品一区二区三区在线观看| 在线观看日本黄| 影音先锋av无码| 色片视频| 日韩在线免费视频| 黄色美女毛片| 久操视频免费看| 国产91探花秘入口| 日韩精品区| 国产在线一二三| 日韩欧美三级在线| 人妻人人骑| 陈冠希和张柏芝mv| 三级乱伦86丝袜无码| 97色碰| 亚洲午夜精品成人毛片| 懂色av粉嫩av蜜臀av| 亚洲成人国产| 久久久www成人免费毛片| 日本黄色A片免费看| 国产成人精品av| 久久爱成人| 激情亚洲五月天| 亚洲成人资源| 亚欧洲精品| 激情操逼| 亚日韩视频| 国产亲子乱婬一级A片借种| 9色网| 国产黄色自拍视频| 日韩人妻精品一区二区| 青青欧美| av午夜福利| 北条麻妃视频在线观看| 五月丁香婷婷成人| 亚洲A片一区二区三区电影网| 四川少扫搡BBBBB搡B| 91成人片| 少妇搡BBBB搡BBB搡18禁| 国产18毛片18水多精品| 午夜福利毛片| 青青娱乐亚洲无| 天天操欧美| 丰满人妻精品一区二区在线| 一夲道无码专区av无码A片| 国产一级A片视频| 麻豆熟女| 黄色一级片免费看| 国产精品剧情| A片黄色视频| 亚洲欧洲成人| 日本二区| 一级乱伦网站| 免费18禁网站| 久久草在线观看| 成人视频观看| 五月丁香视频在线观看| 欧美亚洲天堂网| 四虎Av| av网站免费在线观看| 狠狠干2021| 亚洲视频一区| 日韩无码A| av黄页| 无码中文视频| 欧美一区二区三区在线播放| 人妻黄色视频| 高潮喷水在线观看| 欧美成人福利视频| 超碰人人操人人摸| 免费三级网址| 蜜桃视频网站在线观看| 无码不卡av| 国产va在线观看| 黄色片久久久| 91亚洲精品国偷拍自产在线观看 | 亚洲AV无码成人精品区欧洲| 女孩自慰在线观看| 天天干天天操天天爽| av无码电影| 三级片在线看片AV| 97超碰碰碰| 亚洲欧美日韩一区二区| 99视频精品视频| 草逼视频网站| 国产精品国产精品国产专区不片| 国产成人精品a区在线观看| 婷婷五月天丁香网| 在线免费观看黄| 亚洲一区免费| 在线免费看黄网站| 老熟女视频| 欧洲无码一区二区三区| 色综合激情| 国产精品内射| 污视频网站免费观看| 九色国产在线| 2025AV中文字幕| 亚洲在线成人| 玖玖精品| 高潮视频在线| 久久男人| 国产日韩欧美| 天堂网一区二区三区| 黄片免费在线播放| 亚洲视频中文字母| 又色又爽| 日韩免费毛片| av操操操| 欧美五月激情| 神马午夜精品95| 欧美性生交18XXXXX无码| 日本a级视频| 亚洲aaa在线| av在线免费观看网址| 亚洲无码偷拍| 亚洲天堂视频网站| 国产又色又爽又黄又免费| а√天堂中文最新版8| 免费无码在线视频| 久久伊人网站| 无码一区二区三区免费看| 成人h视频|