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

Redis 到底是怎么實(shí)現(xiàn)“附近的人”這個(gè)功能的呢?

共 21937字,需瀏覽 44分鐘

 ·

2021-08-05 03:39

來(lái)源 | https://juejin.cn/post/6844903966061363207

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

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

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

操作命令

自Redis 3.2開(kāi)始,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)集合中與中心的距離不超過(guò)給定最大距離的所有位置對(duì)象;

  • GEORADIUSBYMEMBER: 以給定的位置對(duì)象為中心,返回與其距離不超過(guò)給定最大距離的所有位置對(duì)象。

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

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

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

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

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

在Redis源碼geo.c的文件注釋中,只說(shuō)明了該文件為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為集合名稱(chēng),member為該經(jīng)緯度所對(duì)應(yīng)的對(duì)象。在實(shí)際運(yùn)用中,當(dāng)所需存儲(chǔ)的對(duì)象數(shù)量過(guò)多時(shí),可通過(guò)設(shè)置多key(如一個(gè)省一個(gè)key)的方式對(duì)對(duì)象集合變相做sharding,避免單集合數(shù)量過(guò)多。

成功插入后的返回值:

(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ì)象名稱(chēng)
        /* 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ì)象元素名稱(chēng)和分值
        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);
}

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

double類(lèi)型精度為52位;

geohash是以base32的方式編碼,52bits最高可存儲(chǔ)10位geohash值,對(duì)應(yīng)地理區(qū)域大小為0.60.6米的格子。換句話(huà)說(shuō)經(jīng)Redis geo轉(zhuǎn)換過(guò)的位置理論上會(huì)有約0.31.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)集合中與中心的距離不超過(guò)給定最大距離的所有位置對(duì)象。

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

額外參數(shù):

- WITHDIST:在返回位置對(duì)象的同時(shí),將位置對(duì)象與中心之間的距離也一并返回。距離的單位和用戶(hù)給定的范圍單位保持一致。

- WITHCOORD:將位置對(duì)象的經(jīng)度和維度也一并返回。

- WITHHASH:以 52 位有符號(hào)整數(shù)的形式,返回位置對(duì)象經(jīng)過(guò)原始 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)記為寫(xiě)入命令,從而只會(huì)查詢(xún)(寫(xiě)入)主實(shí)例,QPS過(guò)高時(shí)容易造成主實(shí)例讀寫(xiě)壓力過(guò)大。

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

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

成功查詢(xú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),看不下去的可直接看中文注釋?zhuān)蛑苯犹叫〗Y(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ù)用戶(hù)輸入(經(jīng)緯度/member)確認(rèn)中心點(diǎn)經(jīng)緯度
    int base_args;
    double xy[2] = { 0 };
    if (flags & RADIUS_COORDS) {
    ……
    }

//獲取查詢(xún)范圍距離
    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)及其周?chē)?個(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)及其周?chē)?個(gè)geohash網(wǎng)格區(qū)域進(jìn)行查找”。

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

我們依次來(lái)看:

計(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ì)算帶查詢(xún)的9個(gè)搜索框的geohash精度(位)
//這里用到latitude主要是針對(duì)極地的情況對(duì)精度進(jìn)行了一些調(diào)整(緯度越高,位數(shù)越小)
    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ò)充,確定周?chē)?個(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)及其周?chē)?個(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中滿(mǎn)足條件的對(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集合中滿(mǎn)足條件的點(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),效率可比擬于二叉查找樹(shù)),沒(méi)有則返0
        if ((ln = zslFirstInRange(zsl, &range)) == NULL) {
            /* Nothing exists starting at our min. No results. */
            return 0;
        }

  //從首個(gè)元素開(kāi)始遍歷集合
        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)建并返回滿(mǎn)足條件的元素
    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é)

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

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

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

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

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

令左圖的中心為搜索中心,綠色圓形區(qū)域?yàn)槟繕?biāo)區(qū)域,所有點(diǎn)為待搜索的位置對(duì)象,紅色點(diǎn)則為滿(mǎ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)行查詢(xún),或者說(shuō)這種策略的優(yōu)勢(shì)在哪,讓我們以問(wèn)答的方式進(jìn)行分析說(shuō)明。

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

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

換句話(huà)說(shuō),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)格,主要原因還是為了避免邊界情況,盡可能縮小查詢(xún)區(qū)域范圍。試想以0經(jīng)緯度為中心,就算查1米范圍,單個(gè)網(wǎng)格覆蓋的話(huà)也得查整個(gè)地球區(qū)域。而向四周八個(gè)方向擴(kuò)展一圈可有效避免這個(gè)問(wèn)題。

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

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

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

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

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

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

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

往期推薦

Spring Boot中使用時(shí)序數(shù)據(jù)庫(kù)InfluxDB

萬(wàn)萬(wàn)沒(méi)想到!logger.info() 還能導(dǎo)致線(xiàn)上故障?

干掉菜鳥(niǎo)?微信又推出新功能:一鍵寄快遞

IntelliJ IDEA 2021.2 正式發(fā)布了!

如何從 100 億 URL 中找出相同的 URL?


喜歡本文歡迎轉(zhuǎn)發(fā),關(guān)注我訂閱更多精彩

關(guān)注我回復(fù)「加群」,加入Spring技術(shù)交流群

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

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 中文字幕视频一区| 六月丁香久久| 男女啪啪免费视频| 99久久国产精| 日本亚洲精品秘入口A片| 亚洲va在线∨a天堂va欧美va| www.狠狠操| 中文在线字幕电视剧免费平台| 亚洲AV无码精品成人| 三上悠亚一区二区| av青青草| 91在线一区二区三区| 成人性爱免费视频| 久操免费观看| 亚洲精品国产精品国自产| 青青草视频免费观看| 亚洲国产成人在线| 免费看日P视频| 久久女人| 強姦婬片A片AAA毛片Mⅴ| 日韩在线精品| 日韩大香蕉在线| 中文字幕无码网站| 国产精品久久久久久无人区| 肏屄综合网| av免费观看网站| 成人AV免费观看| 免费中文字幕日韩欧美| 国产高清在线观看| 色婷婷一区| 精品视频国产| 国产亚洲日韩在线| 欧美性性生交XXXXX无码| 国产亚洲色婷婷久久99精品| 黄片高清无码在线观看| A级毛片视频| 日韩精品一区二区三区在线观看免费| 欧美A片免费观看| 亚洲色在线视频| 丁香花在线小说免费全文| 久久黄色网| 黄色视频网站免费在线观看| 狠狠撸在线观看| 亚洲无码成人视频| 91久久综合| 日韩高清无码三级片| 欧美天天性爱| 天堂色综合| 黄色AV免费观看| 日韩黄色激情| 国产午夜成人视频| 先锋资源男人站| 亚洲成年人网| 免费一级欧美片在线观看| 欧美成人A级片| 永井玛丽亚av无码中出流出| 黄色操逼视频| www.中文字幕| 成人做爰100片免费看| 亚洲AV无码乱码| 亚洲中文在线播放| 精品无码一区二区三| 大香蕉人人| 99这里只有精品视频| 国产精品美女毛片真酒店| 一级a一级a爱片免费视频| 操逼视频在线看| 久久噜噜噜精品国产亚洲综合| 精品国产污污免费网站入口| 艳妇乳肉豪妇荡乳AV无码福利 | 国产高清一区二区| 97A片在线观看播放| 欧美日本国产| 五十路AV| 日韩乱伦电影| 日韩欧美成人在线| 色色欧美| 特级无码| 五月婷婷av| 人人操人人插| 91精品久久久久久久| 91传媒在线观看| 国产熟女视频| 91AV在线播放| 久久草| 91成人做爰A片| 欧美mv日韩mv国产网站| 日韩一级| 在线日韩中文字幕| 欧美韩日| 免费黄色Av| 无码视频日韩| 欧美va视频| 欧美综合区| 日韩不卡视频在线观看| 亲孑伦XXXⅹ熟女| 亚洲天堂中文| 黄色福利视频在线观看| 国产剧情一区二区三区| 无码A级片| 日日操夜夜| 亚洲40p| 亚洲国产日本| 久操福利| 天天添天天干| 亚洲日韩高清无码| 欧美精品久久久久久久久老牛影院| 天堂中文在线资源| 蜜臀久久99精品久久久巴士| 爆乳一区二区三区AV| 国产欧美综合视频| 日韩做爱| 成人无码99| 操b视频免费| 日本无码成人片在线播放| 国产精品99精品| 国产精品色情| 久久99国产精品| 久久久久无码精品国产91福利| 日韩一区在线视频| 亚洲AV无码电影| 中文字幕+乱码+中文乱码www| 在线天堂网| 日韩Av无码一区二区三区不卡| 日本少妇视频| 欧美精品毛片| 五月丁香激情四射| 免费在线观看AV片| H片免费在线观看| 婷婷色在线观看| 天天干天天舔| 91美女网站| 高清无码视频免费观看| 97人人艹| 久久久电影| 黄色网址在线观看视频| 人妻18无码人伦一区二区三区精品| 91无码人妻精品1国产四虎| 亚洲H| 国产精品久久无码| 91九色视频| 天天摸天天操| 国产精品久久久久久久久免费无码| 日韩av三级在线观看| 大香蕉第一页| 亚洲三级黄片| 日韩有码中文字幕在线观看| 俺也去大香蕉| www欧美日韩| 色九九九| 国产无码av| 久久久久久一| 走光无码一区二区三区| 国产三级视频在线| 亚洲高清成人动漫| 亚洲清高毛无码毛片| 97资源在线| 无码一区二区北条| 一牛影视精品av| 欧美一级a视频免费放| yw视频在线观看| 天天操夜夜操人人操| av在线一区二区| 波多野结衣不卡| 久久嫩草精品久久久久精| 成人黄色在线观看视频| 综合伊人大香蕉| 99热国产在线观看| 国产成人AV在线播放| 成人三级片网站| 成人小视频观看| 国产无遮挡又黄又爽又| 蜜桃视频无码区在线观看| AV2014天堂网| 3344gc在线观看入口| 黑人AV在线| 午夜五月天| 大香蕉青青| 国产熟妇码视频app| 亚洲爱| 欧美日韩免费在线观看| 亚洲二区后入极品| 91视频综合网| 久一久久| 久久免费视屏| 午夜探花| 亚洲图片在线播放| 美女人人操| 黄色免费观看网站| 人人摸人人操人人| 高清免费无码| 国产aaaaaaaaaaaaa| 九色PORNY国产成人| 一级一A片一a免费看| 免费一区| 亚洲成人一区二区在线观看| 大香蕉大香蕉免费网| 色欲五月天| 看毛片网址| 欧美精产国品一二三区| 亚洲中文字幕播放| AV五月| 国产麻豆精品成人毛片| 中文av字幕| 一区二区三区精品婷婷| 亚洲视频天天射| 人人看人人搂人人摸| 人人干人人操人人摸| 操人视频在线观看| 爆乳一区二区三区AV| 天天舔| 日韩精品免费一区二区在线观看| 亚州成人视频| 无码一区二区三区四区五区六区| 一级片在线观看视频| 亚洲天堂2014| 色先锋资源站| 久草一区二区三区| 中文无码第一页| 亚洲视频国产| 国产十欧洲十美国+亚洲一二三区在线午夜| 怡春院首页| 亚洲1区| 五月天无码| 人人操人人干97| 日韩欧美高清在线| 亚洲电影无码| 亚洲成人黄色| 无码在线视频播放| 黄片无遮挡| 中文字幕亞洲高清手機版第617| 国内自拍激情视频| 在桌下含她的花蒂和舌头H视频| 风流少妇一区二区三区91| 色欲AV在线| 俺来也俺去| 色色五月丁香婷婷| 97人人爱| 在线观看av中文字幕| 欧美成人性爱在线| 亚洲精品成人av无码| www.91av| 11一12周岁女毛片| 影音先锋AV在线资源| 成人三级电影| 91视频网站入口| 天堂网在线观看| 无码国产精品一区二区免费96| 97资源视频| 亚久久久| 老熟女痒到不行-ThePorn| 91人妻日韩人妻无码专区精品| 中文字幕内射| 亚洲综合图区| 白丝久久| 中文字幕在线中文| 国产一区免费| 天天搞搞| 日韩亚洲欧美在线| 亚洲成人国产| 动漫av网站| 拍真实国产伦偷精品| 欧美视频一区二区三区| 亚洲综合一区二区三区| 黄色成人网站在线播放| 丰臀肥逼高清视频电影播放| 蜜桃人妻无码AV天堂三区| 美女91视频网站| 久久久久久久久久国产精品免费观看-百度 | 欧美性爱69| 亚洲a在线观看| 亚洲成人在线一区| 亚洲成人AV无码| 欧美卡一卡二| 一区二区三区福利| 久久这里只有精品99| 久草社区在线| 毛茸茸BBBBBB毛茸茸| 青青草免费公开视频| 能看的操逼网站| 裸体美女视频欧美18| 国产黄色免费网站| 狠狠操免费| 欧洲操逼视频| 亚洲av性爱| 51AV在线| 成人777| 99久久成人| 欧美成人免费网站| 久久丁香五月天| 亚洲电影在线| 青青草手机在线视频| 色欲一区二区三区| 熟妇人妻中文AV无码| 狠狠爱av| 亚洲操色| 性爱综合网| a黄色视频| 伊人激情五月天| 美女网站色| 亚洲最大福利视频| 国产一级婬女AAAA片季秀英| A片视频播放| 国产乱子伦一区二区三精品| 永久免费黄色视频网站| 日韩特级毛片| 四虎影院中文字幕| 91青青草在线| 99热1| 丁香六月久久| 学生妹毛片| 在线乱视频| 天天色色综合| 国产成人小视频在线观看| 欧美毛片在线观看| 国产中文字幕AV在线播放| 亚洲A片一区二区三区电影网| xxx综合网| 免费黄视频在线观看| 亚洲人妻少妇| 欧美三区四区| 伊人999| 能看的操逼网站| 成人无码区免费A片久久| 99re6热在线精品视频功能| 国产精品成人免费视频| 亚洲成人视频在线观看| 色婷婷久综合久久一本国产AV | 99久久婷婷国产综合精品青牛牛 | 色就是色欧美| 欧美亚洲日韩在线观看| 日本一区二区三区在线观看| 日韩精品在线视频观看| 中文字幕视频在线| 北条麻妃99精品青青久久| 日本一级黃色大片看免费| 好好的日视频| 丁香五月婷婷色| 欧美一区二区精品| 亚洲无码视频免费在线观看| 国产一级做a爱免费视频| 亚洲视频中文字幕| 嫩BBB槡BBBB槡BBBB| 国产二区三区| 91日韩视频在线| 欧美视频中文字幕| 亚洲中文AV在线| 高清无码一区二区三区四区| 瑟瑟免费视频| 一本色道久久综合亚洲精品久久| 欧美日韩视频一区二区| 老司机无码视频| 激情视频在线播放| 国内自拍第一页| 免费看黄色片视频| 欧美不卡| 黄色亚洲网站| 伊人乱伦| 成人免费黄色片| 人人舔视频| 91久久成人| 久久毛久久久j| 亚洲美女在线观看| 超碰在线人人干| 国产精品成人影视| 中文无码高清在线| 五月天狠狠操| 欧美色图色就是色| 国产精品无码永久免费不卡| 婷婷五月丁香在线| 欧美一区二区在线| 丁香五月中文| 在线观看av网站中文字幕| 欧美日韩免费视频| 国产一级特黄aaa大片| 91精品婷婷国产综合久久| 精品色片| A黄色片| 黑人aV| 亚洲日韩一区二区| 日韩成人影视| 久久夜色精品噜噜亚洲AV| 黄色免费看| 日韩精品无码av| 亚洲欧美日韩久久| 成人网站中文字幕| 麻豆AV96熟妇人妻| 性福利导航| 少妇人妻偷人精品无码视频新浪 | 一道本无码在线观看| 无码伦理电影| 农村少妇久久久久久久| 精品无人区无码乱码毛片国产| 強姧伦一区二区三区在线播放| 国产AⅤ无码一区二区| 国产黄色录像| 亚洲爆乳无码一区二区三区| 久久黄色A片| 亚洲精品无码电影| 色欲AV秘无码一区二区三区| www.蜜桃| 一级特黄录像免费播放下载软件| 波多野结衣成人网站| 一道本无码在线| 成年人激情网| 狠狠地操| 大香蕉1024| 麻豆黄片| 大香焦久久| 人妻精品综合码| 亚洲黄色av| 欧美三级美国一级| 午夜福利免费在线观看| 特级特黄AAAAAAAA片| 国产免费观看视频| 天天玩夜夜玩天天玩国产99 | 老女人肏屄视频| 色逼视频| 伊人大香蕉综合在线| 成人日韩精品| 最新国产av| 亚洲高清超级无码在线视频观看| AV无码精品| 日韩精品成人在线| 91久久超碰| 亚洲视频一区| 操东北女人逼| 扒开让我91看片在线看| 无码一区二区三| 操人视频在线观看| 日本一区二区视频在线观看| 国产激情综合| 日日操夜夜| 日本家庭乱伦视频| 日本中文字幕无码| 台湾毛片| 美女裸体网站国产| a国产| 狠狠干狠狠爱| 亚洲五月六月| 91免费网站| 色情一级AA片免费观看| 久久久综合网| 日韩成人无码AV| 天天看A片| 午夜爽爽视频| 91精品久久久久久久| 熟女综合| 91白丝喷水自慰网站| 亚洲无码三级| www.狠狠爱| 人妻丰满熟妇av无码| 操操影院| 日韩毛片中文字幕| 特级444www| 麻豆免费版在线观看| 嗯啊av| 无码一区视频| 91麻豆精品91久久久久同性| 777久久| 97久久一区二区| 91香蕉视频在线看| 亚洲av电影在线观看| 国产小视频在线播放| 超碰人妻人人操| 久久三级片| 亚洲色图一区二区三区| 国产做爰XXXⅩ久久久骚妇| 天堂黄片| 东京热这里只有精品| 欧美日韩黄色片| 欧一美一婬一伦一区二区三区 | 天天射视频| 亚洲小说欧美激情另类A片小说| 一级黄色片免费观看| 性感成人在线| 正在播放国产精品| 国产成人自拍视频在线观看| 青青精品| 99热这里都是精品| 激情五月天网址| 无码导航| 你懂的在线视频观看| 久操精品| 成人网站毛片| 亚洲vs无码秘蜜桃| 青操在线| 岛国AV在线| 人人爽人人爱| 一个人看的视频www| 国产三级片视频在线观看| 大香蕉综合在线| 台湾成人在线| 久久成人福利| 草av| 亚洲在线免费观看| 无码精品人妻一区二区三区漫画 | 国产乱伦免费视频| 亚洲aaaaaa| 逼特逼视频| 狠狠一区| 国产操逼大全| 息子交尾一区二区三区| 成人伦理聚合| 手机av在线| 久久亭亭| 小明成人免费视频| 免费69视频| 国产九九九| 午夜香蕉视频| 国产精品成人免费久久黄AV片| 在线色综合| 成人av影院| 日本在线| 亚洲五月丁香| 精品孕妇一区二区三区| 国产成人精品免高潮在线观看| av在线资源网站| 久久精品中文字幕| 精品国产一区二区三区久久久蜜月| 各种BBwBBwBBwBBw| 国产精品无码不卡| 亚洲无码高清在线观看视频| 国产一级无码| 99热在线观看精品免费| 狠狠干综合网| 亚洲熟妇在线观看| 一级艹逼| 日韩在线视频观看| 欧美拍拍视频| 草草国产| 黄色电影视频在线| 日韩无码中文字| 中文字幕福利电影| 97超碰在线免费观看| 日本在线精品视频| 水果派解说av| 超碰人人爱人人操| 亚洲va欧美va天堂v国产综合| 久久一级片| 爱射综合| 国产美女全裸网站| 欧美亚洲成人电影| 人人妻人人爱人人| 国产精品麻豆视频| 苍井空亚洲精品AA片在线播放| 国产www在线观看| 日韩精品免费观看| 91大神在线观看入口| 热re99久久精品国产99热| 麻豆午夜福利| 99在线免费视频| 特级特黄AAAAAAAA片| 亚洲精品国产成人综合久久久久久久久 | 神马午夜精品| 91.www91成人影视在线观看91成人网址9 | 国产黄色精品视频| 午夜做爱视频| 大香蕉综合网站| 91精品国产乱码久久久久| 久久久久久久毛片| 国产激情视频在线| 老熟女痒到不行-ThePorn| 中文字幕在线观看高清| 久久五月视频| 久久久久久五月天| 中文字幕永久在线视频| 人人操人人爱人人摸| 北条麻妃在线观看香蕉| 性爱综合网| 久久国产av| 91禁樱桃在线| 日韩啪啪网站| 日韩一区二区三| 国产美女做爱视频| 先锋AV资源网| 国产无码乱伦内射| 囯产精品久久久久久久久久久久久久 | 无码av一区二区| 国产一区二区视频在线| 久久动态图| 免费无遮挡视频网站视频| 少妇BBBBBB| 大香蕉电影网| 伊人大香蕉在线观看| 人人妻人人爽人人精品| 中国一级片| 久久国产精品一区二区三区| 学生妹一级J人片内射视频| 丁香五月色情| 99免费在线观看| 国产一级大片| 丁香婷婷色五月| 蜜臀久久99精品久久久巴士| 色婷婷艹| 久久伊人中文字幕| 黑人av在线观看| 日韩欧美黄色片| 蜜臀久久精品久久久久| 超碰77| 中文字幕+乱码+中文字幕电视剧| 在线播放JUY-925被丈夫上司侵犯的第7天| 超碰777| 青娱乐青青草| 国产一区二区久久| 青草视屏| 亚洲日韩欧美成人| 99综合视频| 先锋影音av资源网| 亚洲视频在线观看| 大香蕉伊人操| 国产精品国产三级国产AⅤ中文 | 免费看操片| 美女黄片| 天天操夜夜操| 99久久国产视频| 欧美熟妇高潮流白浆| 日本成人网址| 中文字幕免费高清在线观看| 中文字幕的| 老司机在线免费视频| 亚洲日逼网| 亚洲欧洲av| 黑人久久| 性视频人人| 欧美成人69| 欧美三级推荐| 操BBBB| 性感成人在线| 亚洲国产精品尤物yw在线观看 | 欧美午夜福利在线观看| 99精品在线| 色XXX| 无码国产高清| 高清无码视频在线免费观看| 亚洲天堂在线观看视频| 性爱xxxxx| 日韩欧美国产精品综合嫩V| 欧一美一婬一伦一区二区三区黑人| 日韩小电影| 91破处网站| 婷婷激情av| 尻屄网站| 爱插美女网| 一区二区A片| 丁香五月影院| 日AV在线无| 丁香婷婷社区| av网站免费看| 人妻少妇视频| 麻豆视频在线播放| 影音av资源| 女人天堂AV| 成人一区二区在线| 中文字幕在线不卡视频| 特级特黄AAAAAAAA片| 国内自拍2025| 亚欧洲精品在线视频| 爱搞在线观看| 色欲天天网| 大香蕉国产在线视频| AAA免费视频| 西西人体大胆ww4444图片| 亚洲码成人| 国产无码高潮在线| 日韩性无码| 一本色道久久综合无码人妻软件| 黄色片网站在线观看| 成年人视频在线观看免费| 91无码高清| www.亚洲天堂| 久久久极品| 麻豆视频在线| 午夜探花视频| 日韩欧美在中文| 超碰麻豆| 99re88| 青春草在线视频观看| 99成人乱码一区二区三区在线| 国产成人网站免费观看| 婷婷成人电影| 青青激情视频| 性欧美69| 2025毛片| 黄色片国产| 亚洲av影院| 伊人久久成人| 青青草99| 麻豆熟妇乱妇熟色A片在线看| 巨爆乳肉感一区二区三区| 久久91| 丁香婷婷综合网| 97碰碰碰| 狠狠躁夜夜躁人人爽视频| 高清无码中文字幕在线观看| 日本韩国叼嘿片| 这里只有精品视频在线| 久久精品成人电影| 国产夫妻av| 91午夜视频| 激情麻豆论坛| 蜜桃AV无码一区二区三区| 午夜无码视频| 99热日韩| 久久九| 国产精品国产三级囯产普通话2| 自拍偷拍成人视频| 亲子乱AV一区二区| 浮力影院欧美| 一级A片视频免费看| 伊人精品在线| 亚洲天堂影院| 国产人妖网站| AV黄片| 91性爱视频在线观看| 日韩免费视频在线观看| 国产AV无码专区| 樱桃码一区二区三区| 一本加勒比HEZYO东京热无码| 一区二区高清| 肏屄视频网| 一级片免费在线观看| 一级特黄色片| 日韩一级| 欧美毛片在线观看| 亚洲人妻电影一区| a视频免费观看| 99久久综合国产精品二区| 欧美日韩成人视频| 中国操B视频| 日本免费黄色电影| 黄片视频在线免费看| 成人精品鲁一鲁一区二区| 久久精品秘一区二区三免费| 亚洲视频免费观看| 91av久久| 无码成人在线观看| 中文字幕久久人妻无码精品蜜桃| 91女色| 亚洲国产一区二区三区| 国产99精品视频| 狠狠干亚洲视频| 毛片高清无码| 在线日韩一区二区| 成人免费无码婬片在线观看免费 | 国产AV一区二区三区四区五区| 波多野结衣av在线播放| 西西人体444www| 久久精品熟妇丰满人妻99| 激情五月伊人| 麻豆MD传媒MD0071| 在线成人免费视频| 蜜桃人妻无码AV天堂二区| 久热综合| 午夜偷拍| 国产黄色直播| 黑人操逼视频| 俺来射| 高清无码片| 亚洲AV中文| 黄色片a片| 国产A级黄色片| 亚洲精品大片| 大香蕉国产在线视频| C逼| 奇米AV| 91精品成人| 麻豆视屏| 夜夜骚av一区二区三区| 91大香蕉视频| 国产精品久久久久久最猛| 国产精品天天干| 欧美成人免费A级在线观看| 婷婷五月天免费视频| 青青国产视频| 杨贵妃一级婬片90分钟| 欧美第一视频| 国产高清AV| 欧美成人三级在线| 北条麻妃三区| 天堂一区二区三区| 激情综合婷婷久久| 午夜久| 天天射综合| 天天操免费视频| 国产精品一区二区黑人巨大| 内射视频在线观看| 中文无码第一页| 无码AV天堂| 熟女无码| 精品国产欧美一区二区三区成人| 98在线++传媒麻豆的视频| 久久嫩草精品久久久久| 牛牛AV在线| 三级毛片网站| 天天操夜夜操| 波多野结衣视频在线| 亚洲成人AV电影| www.操B| 国产黄色在线观看| 国产视频你懂的| 亚洲1区| 欧美老妇另类BBwBBw| 国产一区二区00000视频| 中文字幕人妻日韩在线| 亚洲视频高清无码| 久久色片| 不卡AV在线播放| 久久久久久久人妻丝袜| 99热自拍| 超碰性爱| 青青欧美| 日韩AV免费在线播放| 亚洲第一区欧美日韩| 国产无码高清视频| 浮力影院欧美| 特一级黄色视频| 欧美亚洲日韩一区| 亚洲国产一区二区三区四区| 嫩BBB嫩BBB嫩BBBn嫩| 国产成人无码一区二区| 亚洲成人在线无码| 亚洲国产精品精JIZZ老师| 天天夜夜爽| 就去se超碰| 啪啪免费网站| 日本免费无码| 国产色婷婷精品综合在线播放| 激情乱伦网| 综合久久99| 日韩A片无码ⅩXXXX| 91大神shunv| 三级操逼| 欧美一级AAA大片免费观看 | 日本少妇无码| 尤物在线| 91毛片在线观看| 人与禽一级A片一区二区三区| 尹人大香蕉网| 欧一美一伦一A片| 欧美成人视频电影无码高清| 自拍偷拍网站| 午夜福利毛片| A级片在线观看| 人妻av中文字幕| 激情五月婷婷色| 天天操夜夜干| 狠狠色噜噜狠狠狠888| 中文字幕无码精品三级在线欧美| 国产日本欧美韩国久久久久| 婷婷日韩一区二区三区| 人善交精品一区二区三区| 国产一级a一级a免费视频| 羞羞视频com.入口| 亚洲美女在线观看| 日韩在线视频免费播放| 北条麻妃AV在线播放| 免费视频在线观看一区| 精品一区二区三区四区五区六区七区八区九区 | www.91熊猫成人网| 亚洲热在线视频| 性爱xxxxx| 国产激情内射| 欧美黑人操逼视频| 欧美区在线观看| 亚洲免费观看高清视频| 18禁裸体美女| 无码精品一区二区三区在线播放 | 黄色视频视频| 国产黄色视频在线免费观看| 色色色网站| 777无码| 丁香五月欧美激情| 日本一区免费| 美女免费网站| 嫩苞又嫩又紧AV无码| 欧美AA视频| AV在线一区二区三区| 欧美亚洲成人网| 成人A片免费视频| 亚洲网站免费| 天堂俺去俺来也www久久婷婷| 亚洲无码在线视频观看| 一级A片亲子乱中文| 久久黄色小视频| 久草视频网| 奇米狠狠操| 乖我硬了让老子cao你小视频| 亚洲黄色小视频| 插菊花综合网3| 18岁毛片| 操逼视频在线播放| 国产精品操逼视频| 青青草手机在线视频| 一级性爱视频| 婷婷色色婷婷五月天| 2016av天堂网| 久久婷婷久久| 国产精品一级A片| 午夜国产在线视频|