成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > Redis高效檢索地理位置的原理解析

Redis高效檢索地理位置的原理解析

熱門標(biāo)簽:十堰營(yíng)銷電銷機(jī)器人哪家便宜 北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 魔獸2青云地圖標(biāo)注 日本中國(guó)地圖標(biāo)注 山東外呼銷售系統(tǒng)招商 宿遷便宜外呼系統(tǒng)平臺(tái) 貴州電銷卡外呼系統(tǒng) 超呼電話機(jī)器人 鄭州人工智能電銷機(jī)器人系統(tǒng)

Redis GEO 用做存儲(chǔ)地理位置信息,并對(duì)存儲(chǔ)的信息進(jìn)行操作。通過geo相關(guān)的命令,可以很容易在redis中存儲(chǔ)和使用經(jīng)緯度坐標(biāo)信息。Redis中提供的Geo命令有如下幾個(gè):

  • geoadd:添加經(jīng)緯度坐標(biāo)和對(duì)應(yīng)地理位置名稱。
  • geopos:獲取地理位置的經(jīng)緯度坐標(biāo)。
  • geodist:計(jì)算兩個(gè)地理位置的距離。
  • georadius:根據(jù)用戶給定的經(jīng)緯度坐標(biāo)來獲取指定范圍內(nèi)的地理位置集合。
  • georadiusbymember:根據(jù)儲(chǔ)存在位置集合里面的某個(gè)地點(diǎn)獲取指定范圍內(nèi)的地理位置集合。
  • geohash:計(jì)算一個(gè)或者多個(gè)經(jīng)緯度坐標(biāo)點(diǎn)的geohash值。

要理解Redis的GEO相關(guān)的命令是如何實(shí)現(xiàn)了,就得先理解geohash的原理,本質(zhì)上這些命令就是對(duì)geohash數(shù)據(jù)的封裝而已。

geohash

geohash是2008年Gustavo Niemeye發(fā)明用來編碼經(jīng)緯度信息的一種編碼方式,比如北京市中心的經(jīng)緯度坐標(biāo)是116.404844,39.912279,通過12位geohash編碼后就變成了wx4g0cg3vknd,它究竟是如何實(shí)現(xiàn)的?其實(shí)原理非常簡(jiǎn)單,就是二分,整個(gè)編碼過程可以分為如下幾步。

1. 轉(zhuǎn)二進(jìn)制

上過初中地理的我們都知道,地球上如何一個(gè)點(diǎn)就可以標(biāo)識(shí)為某個(gè)經(jīng)緯度坐標(biāo),經(jīng)度的取值范圍是東經(jīng)0-180度和西經(jīng)0-180度,維度的取值范圍是北緯0到90和南緯0-90度。去掉東西南北,可以分別認(rèn)為經(jīng)度和維度的取值范圍為[-180,180]和[-90,90]。

我們先來看經(jīng)度,[-180,180]可以簡(jiǎn)單分成兩個(gè)部分[-180,0]和[0,180],對(duì)于給定的一個(gè)具體值,我們用一個(gè)bit來標(biāo)識(shí)是在[-180,0]還是[0,180]區(qū)間里。然后我們可以對(duì)這兩個(gè)子區(qū)間繼續(xù)細(xì)分,用更多的bit來標(biāo)識(shí)是這個(gè)值是在哪個(gè)子區(qū)間里。就好比用二分查找,記錄下每次查找的路徑,往左就是0往右是1,查找完后我們就會(huì)得到一個(gè)0101的串,這個(gè)串就可以用來標(biāo)識(shí)這個(gè)經(jīng)度值。

同理維度也是一樣,只不過他的取值返回變成了[-90,90]而已。通過這兩種方式編碼完成后,任意經(jīng)緯度我們都可以得到兩個(gè)由0和1組成的串。
比如還是北京市中心的經(jīng)緯度坐標(biāo) 116.404844,39.912279,我們先對(duì)116.404844做編碼,得到其二進(jìn)制為:

11010010110001101101

然后我們對(duì)維度39.912279編碼得到二進(jìn)制為:

10111000110000111001

2. 經(jīng)緯度二進(jìn)制合并

接下來我們只需要將上述二進(jìn)制交錯(cuò)合并成一個(gè)即可,這里注意經(jīng)度占偶數(shù)位,緯度占奇數(shù)位,得到最終的二進(jìn)制。

1101101110000200111100000001111011010011

3. 將合并后的二進(jìn)制做base32編碼

最后我們將合并后的二進(jìn)制做base32編碼,將連續(xù)5位轉(zhuǎn)化為一個(gè)0-31的十進(jìn)制數(shù),然后用對(duì)應(yīng)的字符代替,將所有二進(jìn)制位處理完后我們就完成了base32編碼。編碼表如下:

最終得到geohash值wx4g0cg3vknd。

geohash是將空間不斷的二分,然后將二分的路徑轉(zhuǎn)化為base32編碼,最后保存下來,從原理可以看出,geohash表示的是一個(gè)區(qū)間,而不是一個(gè)點(diǎn),geohash值越長(zhǎng),這個(gè)區(qū)間就越小,標(biāo)識(shí)的位置也就越精確,下圖是維基百科中不同長(zhǎng)度geohash下的經(jīng)緯度誤差(lat:維度,lng:經(jīng)度)

geohash的用途及問題

geohash成功的將一個(gè)二維信息編碼成了一個(gè)一維信息,這樣編碼我覺得有兩個(gè)好處:1. 編碼后數(shù)據(jù)長(zhǎng)度變短,利于節(jié)省存儲(chǔ)。2. 利于使用前綴檢索。我們來詳細(xì)說下第二點(diǎn)。

從上文中g(shù)eohash的實(shí)現(xiàn)來看,只要兩個(gè)坐標(biāo)點(diǎn)的geohash有共同的前綴,你們我們就可以肯定這兩個(gè)點(diǎn)在同一個(gè)區(qū)域內(nèi) (區(qū)域大小取決于共同前綴的長(zhǎng)度)。這種特性給我們帶來的好處就是,我們可以把所有坐標(biāo)點(diǎn)按geohash做增序索引,然后查找的時(shí)候按前綴篩選,大幅提升檢索的性能。

舉個(gè)例子,假設(shè)我要找北京國(guó)貿(mào)附近3公里內(nèi)的餐館,已知國(guó)貿(mào)的geohash是wx4g41,那我也很輕易就可以計(jì)算出來我需要掃描哪些區(qū)域內(nèi)的點(diǎn)。但有個(gè)點(diǎn)需要注意,上文我已經(jīng)提到過,geohash值實(shí)際上是代表一個(gè)區(qū)域,而不是一個(gè)點(diǎn),找到一批候選點(diǎn)之后還需要遍歷一次計(jì)算下精確距離。

geohash有個(gè)需要注意的問題。geohash是將二維的坐標(biāo)點(diǎn)做了線下編碼(如下圖),有時(shí)候可能會(huì)給人一個(gè)誤解就是如果兩個(gè)geohash之間二進(jìn)制的差異越小,這兩個(gè)區(qū)間距離就越近,這完全是錯(cuò)誤的,比如如下圖0111和1000,這倆區(qū)間二進(jìn)制只差0001但實(shí)際物理距離比較遠(yuǎn)。

如果上圖還不明顯的話,我從Wikipedia上拿到一張圖,虛線是線性索引的路徑,被虛線鏈接的兩個(gè)塊geohash值是非常相近的,如下圖的(7,3)和(0,4),geohash值會(huì)非常相近,但實(shí)際物理距離非常遠(yuǎn),這就是geohash的突變現(xiàn)象,這也導(dǎo)致了不能直接根據(jù)geohash的值來直接判定兩個(gè)區(qū)域的距離大小。

但在實(shí)際使用geohash過程中,時(shí)常會(huì)遇到跨域搜索的情況,比如我要在上圖(3,3)這個(gè)區(qū)間內(nèi)某個(gè)點(diǎn)上搜索距它1個(gè)距離單位的所有其他點(diǎn)集,這個(gè)點(diǎn)集有可能橫跨(3,3)加上它周圍8個(gè)鄰域的9個(gè)區(qū)間,突變的問題會(huì)導(dǎo)致這9個(gè)區(qū)間的geohash不是線性跳轉(zhuǎn)的,但也不是沒法計(jì)算,實(shí)際上可以通過特殊的位運(yùn)算可以很輕易計(jì)算出某個(gè)geohash的8個(gè)鄰域,具體可參考redis源碼中src/geohash.c中g(shù)eohashNeighbors()的具體實(shí)現(xiàn),geohashNeighbors使用了geohash_move_x和geohash_move_y兩個(gè)函數(shù)實(shí)現(xiàn)了geohash左右和上下的移動(dòng),這樣可以很容易組合出8個(gè)鄰域的geohash值了。

static void geohash_move_x(GeoHashBits *hash, int8_t d) {
    if (d == 0)
        return;

    uint64_t x = hash->bits  0xaaaaaaaaaaaaaaaaULL;
    uint64_t y = hash->bits  0x5555555555555555ULL;

    uint64_t zz = 0x5555555555555555ULL >> (64 - hash->step * 2);

    if (d > 0) {
        x = x + (zz + 1);
    } else {
        x = x | zz;
        x = x - (zz + 1);
    }

    x = (0xaaaaaaaaaaaaaaaaULL >> (64 - hash->step * 2));
    hash->bits = (x | y);
}

static void geohash_move_y(GeoHashBits *hash, int8_t d) {
    if (d == 0)
        return;

    uint64_t x = hash->bits  0xaaaaaaaaaaaaaaaaULL;
    uint64_t y = hash->bits  0x5555555555555555ULL;

    uint64_t zz = 0xaaaaaaaaaaaaaaaaULL >> (64 - hash->step * 2);
    if (d > 0) {
        y = y + (zz + 1);
    } else {
        y = y | zz;
        y = y - (zz + 1);
    }
    y = (0x5555555555555555ULL >> (64 - hash->step * 2));
    hash->bits = (x | y);
}

Geo in redis

上文中花了大量篇幅講解了geohash的實(shí)現(xiàn),其實(shí)看到這里,你基本上已經(jīng)理解了redis中的geohash的實(shí)現(xiàn)了。本質(zhì)上redis中的geo就是對(duì)geohash的封裝,具體geohash相關(guān)的代碼就不給大家列了(可自行查閱),就給大家介紹下redis geo里的大體流程。
首先,可能大家最好奇的是geohash在redis中是怎么存儲(chǔ)的,從geoadd命令的實(shí)現(xiàn)可以一窺端倪。

/* GEOADD key [CH] [NX|XX] long lat name [long2 lat2 name2 ... longN latN nameN] */
void geoaddCommand(client *c) {
    int xx = 0, nx = 0, longidx = 2;
    int i;

    /* 解析可選參數(shù) */
    while (longidx  c->argc) {
        char *opt = c->argv[longidx]->ptr;
        if (!strcasecmp(opt,"nx")) nx = 1;
        else if (!strcasecmp(opt,"xx")) xx = 1;
        else if (!strcasecmp(opt,"ch")) {}
        else break;
        longidx++;
    }

    if ((c->argc - longidx) % 3 || (xx  nx)) {
        /* 解析所有的經(jīng)緯度值和member,并對(duì)其個(gè)數(shù)做校驗(yàn) */
            addReplyErrorObject(c,shared.syntaxerr);
        return;
    }

    /* 構(gòu)建zadd的參數(shù)數(shù)組 */
    int elements = (c->argc - longidx) / 3;
    int argc = longidx+elements*2; /* ZADD key [CH] [NX|XX] score ele ... */
    robj **argv = zcalloc(argc*sizeof(robj*));
    argv[0] = createRawStringObject("zadd",4);
    for (i = 1; i  longidx; i++) {
        argv[i] = c->argv[i];
        incrRefCount(argv[i]);
    }

    /* 以3個(gè)參數(shù)為一組,將所有的經(jīng)緯度和member信息從參數(shù)列表里解析出來,并放到zadd的參數(shù)數(shù)組中 */
    for (i = 0; i  elements; i++) {
        double xy[2];

        if (extractLongLatOrReply(c, (c->argv+longidx)+(i*3),xy) == C_ERR) {
            for (i = 0; i  argc; i++)
                if (argv[i]) decrRefCount(argv[i]);
            zfree(argv);
            return;
        }

        /* 將經(jīng)緯度坐標(biāo)轉(zhuǎn)化成score信息 */
        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[longidx + i * 3 + 2];
        argv[longidx+i*2] = score;
        argv[longidx+1+i*2] = val;
        incrRefCount(val);
    }

    /* 轉(zhuǎn)化成zadd命令所需要的參數(shù)格式*/
    replaceClientCommandVector(c,argc,argv);
    zaddCommand(c);
}

原來geo的存儲(chǔ)只是zset包了一層殼(是不是有點(diǎn)小失望),關(guān)于zset的具體實(shí)現(xiàn)可以參考我之前寫的文章redis中skiplist的實(shí)現(xiàn)。

我們?cè)賮碓敿?xì)看下georadius的大體執(zhí)行流程(代碼偏長(zhǎng),故刪除大量細(xì)節(jié)代碼)。

void georadiusGeneric(client *c, int srcKeyIndex, int flags) {
    robj *storekey = NULL;
    int storedist = 0; /* 0 for STORE, 1 for STOREDIST. */

    /* 根據(jù)key找找到對(duì)應(yīng)的zojb */
    robj *zobj = NULL;
    if ((zobj = lookupKeyReadOrReply(c, c->argv[srcKeyIndex], shared.emptyarray)) == NULL ||
        checkType(c, zobj, OBJ_ZSET)) {
        return;
    }

    /* 解析請(qǐng)求中的經(jīng)緯度值 */
    int base_args;
    GeoShape shape = {0};
    if (flags  RADIUS_COORDS) {
    /*
     * 各種必選參數(shù)的解析,省略細(xì)節(jié)代碼,主要是解析坐標(biāo)點(diǎn)信息和半徑   
     */ 
    }

    /* 解析所有的可選參數(shù). */
    int withdist = 0, withhash = 0, withcoords = 0;
    int frommember = 0, fromloc = 0, byradius = 0, bybox = 0;
    int sort = SORT_NONE;
    int any = 0; /* any=1 means a limited search, stop as soon as enough results were found. */
    long long count = 0;  /* Max number of results to return. 0 means unlimited. */
    if (c->argc > base_args) {
    /*
     * 各種可選參數(shù)的解析,省略細(xì)節(jié)代碼   
     */ 
    }
    
    /* Get all neighbor geohash boxes for our radius search
     * 獲取到要查找范圍內(nèi)所有的9個(gè)geo鄰域 */
    GeoHashRadius georadius = geohashCalculateAreasByShapeWGS84(shape);

    /* 創(chuàng)建geoArray存儲(chǔ)結(jié)果列表 */
    geoArray *ga = geoArrayCreate();
    /* 掃描9個(gè)區(qū)域中是否有滿足條的點(diǎn),有就放到geoArray中 */
    membersOfAllNeighbors(zobj, georadius, shape, ga, any ? count : 0);

    /* 如果沒有匹配結(jié)果,返回空對(duì)象 */
    if (ga->used == 0  storekey == NULL) {
        addReply(c,shared.emptyarray);
        geoArrayFree(ga);
        return;
    }

    long result_length = ga->used;
    long returned_items = (count == 0 || result_length  count) ?
                          result_length : count;
    long option_length = 0;

    /* 
     * 后續(xù)一些參數(shù)邏輯,比如處理排序,存儲(chǔ)……
     */
    // 釋放geoArray占用的空間 
    geoArrayFree(ga);
}

上述代碼刪減了大量細(xì)節(jié),有興趣的同學(xué)可以自行查閱。不過可以看出georadius的整體流程非常清晰。

解析請(qǐng)求參數(shù)。計(jì)算目標(biāo)坐標(biāo)所在的geohash和8個(gè)鄰居。在zset中查找這9個(gè)區(qū)域中滿足距離限制的所有點(diǎn)集。處理排序等后續(xù)邏輯。清理臨時(shí)存儲(chǔ)空間。

結(jié)語(yǔ)

由于文章篇幅有限,而且著重講解了geohash的實(shí)現(xiàn),并未展開講解redis中g(shù)eo相關(guān)的各種細(xì)節(jié),如讀者有興趣可以詳細(xì)閱讀redis中的src/geo.c了解各類細(xì)節(jié)。

參考資料

wikipedia geohash

Geohash算法原理及實(shí)現(xiàn)

本文是Redis源碼剖析系列博文,同時(shí)也有與之對(duì)應(yīng)的Redis中文注釋版,有想深入學(xué)習(xí)Redis的同學(xué),歡迎star和關(guān)注。
Redis中文注解版?zhèn)}庫(kù):https://github.com/xindoo/Redis
Redis源碼剖析專欄:https://zxs.io/s/1h

以上就是Redis是如何高效檢索地理位置的詳細(xì)內(nèi)容,更多關(guān)于Redis檢索地理位置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • redis數(shù)據(jù)庫(kù)查找key在內(nèi)存中的位置的方法
  • PHP redis實(shí)現(xiàn)超迷你全文檢索

標(biāo)簽:果洛 楊凌 臺(tái)州 江蘇 北京 大慶 朝陽(yáng) 吉安

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis高效檢索地理位置的原理解析》,本文關(guān)鍵詞  Redis,高效,檢索,地理位置,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis高效檢索地理位置的原理解析》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Redis高效檢索地理位置的原理解析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国精产品视频一二二区| 91精品在线免费观看| 国产亚洲自拍av| 国产成人午夜片在线观看高清观看| 国产精品久久久久久在线观看| yellow网站在线观看| 免费无遮挡无码永久在线观看视频| 欧美两根一起进3p做受视频| 91sese| 97久久夜色精品国产| ass精品国模裸体欣赏pics| 国内av免费| 伊人色综合久久久| 亚洲精品欧美专区| 国产超碰人人爽人人做人人爱| 国产三级电影在线观看| 国产日韩一区二区三区在线播放| 蜜桃网站成人| 国产一区二区三区四区五区入口| 精品无码免费视频| 在线天堂视频| 中文字幕人成不卡一区| 日韩av网址在线| h视频在线免费观看| 色综合久久六月婷婷中文字幕| 91麻豆精品国产91久久久更新时间| 在线精品国产成人综合| 国产精品无码专区av免费播放| 变态另类ts人妖一区二区| 福利视频在线导航| 校园春色亚洲色图| 欧美亚洲国产bt| 日本一区二区综合亚洲| 国产三级精品三级在线观看国产| 国产精品极品| 日本一区精品久久久久影院| 成全电影播放在线观看国语| 国产成人精品视| 欧美日韩综合不卡| 日韩精品1区2区3区| 成人福利在线观看视频| 日韩免费在线观看av| 一级爱爱免费视频| 色涩视频在线观看| 久久久精品人妻一区二区三区| 国产视频一区二区在线观看| 国产精品18久久久久久久久久久久| 精品国产成人av在线免| av一区二区三区四区电影| 日本少妇性生活| 妖精视频在线观看免费| 欧美一级淫片videoshd| 香蕉人妻av久久久久天天| 欧美日韩中文字幕在线视频| 日韩欧美国产麻豆| 亚洲午夜久久久久久久久电影院| 欧美性猛交xxxx乱大交退制版| 亚洲成a人片在线www| 国产日韩影视精品| 中文字幕永久有效| 任我爽精品视频在线播放| 老熟妇仑乱视频一区二区| 亚洲精品高清视频| 亚洲天堂免费看| 成人性生活视频| 性欧美13一14内谢| 日本精品久久久久中文字幕| 日韩av在线电影观看| 欧美四级在线| 51漫画成人app入口| 天堂在线观看| 精品人妻少妇嫩草av无码| 国产激情第一页| 亚洲国产高清不卡| 精品一区不卡| 国产精品美女视频免费观看软件| 国产欧美日本一区二区三区| www.毛片.com| 久久精品国产精品亚洲精品| 成年人视频网站| 超碰在线91| 精品免费国产二区三区| 国产九九九九| 91在线精品入口| 国内偷自视频区视频综合| 性欧美猛交videos| 久久国产精品无码一级毛片| 日本一区二区动态图| 国内自拍视频在线看免费观看| 精品国产伦一区二区三区免费| 亚洲伊人成综合成人网| 欧美在线日韩精品| 欧美四级电影在线观看| 国产黄色录像片| 国产精品极品尤物在线观看| 国产综合福利在线| 毛片在线导航| 好吊妞无缓冲视频观看| 久久伊人一区| 日本欧美视频在线观看| 日本护士...精品国| 春暖花开亚洲一区二区三区| www.涩涩爱| 欧美另类69精品久久久久9999| 久久精视频免费在线久久完整在线看| 4hu四虎永久在线影院成人| www.91popny.com| 青青草精品在线视频| 日韩视频在线观看免费视频| 日韩av高清在线| 波多野结衣家庭教师在线播放| 成人福利视频| 电影亚洲精品噜噜在线观看| 欧美白人猛性xxxxx交69| 在线观看免费网站黄| 日本调教视频在线观看| 一本精品一区二区三区| 午夜久久一区| 国产免费黄色av| 亚洲精品国产精品乱码不卡| 国产又爽又黄网站亚洲视频123| 99久久精品免费看国产| 手机看片福利盒子久久| 日本视频www色| 欧美日韩第一区日日骚| 天天摸天天操天天干| 欧美日韩高清| 亚洲欧美在线成人| 欧美片网站yy| 性感女国产在线| 亚洲一区二区三区小说| 亚洲欧美另类在线视频| 超碰免费在线| 久久五月激情| 主播大秀视频在线观看一区二区| 成人禁在线观看网站| 在线观看免费黄色小视频| 欧美日韩精品在线播放| 国模叶桐国产精品一区| 亚洲一区二区三区四区不卡| 日日骚久久av| 亚洲电影在线一区二区三区| 中文字幕永久在线| 在线观看中文字幕不卡| 国产精品国产三级国产普通话三级| 欧美少妇xxx| 26uuu亚洲| 国产精品第七十二页| 中文字幕人成一区| 国产一二三av| 国产福利一区二区三区在线视频| 色综合久久88色综合天天提莫| 亚洲国产精品va在线| 超碰在线资源站| 午夜成人免费影院| 综合精品久久久| 国产精品视频一二| 中文字幕天堂在线| 中文av一区二区| 2018av男人天堂| 国产一区二区| 久久久久99精品成人片毛片| 国产一区二区三区网| 国产美女被遭强高潮免费网站| 精品黄色免费中文电影在线播放| 99热国产在线观看| 国产农村妇女毛片精品久久麻豆| 最新国产中文字幕| 中文字幕精品无码一区二区| xxxx日本免费| 久久66热偷产精品| 国产精品日韩在线播放| 欧美熟妇激情一区二区三区| 成人短剧在线观看| 日韩一卡二卡三卡| 夜色激情一区二区| 亚洲国产欧美另类| 1024手机在线观看你懂的| 国产偷人妻精品一区二区在线| 精品国产乱码久久久久久丨区2区| 欧美五级在线观看视频播放| 免费在线午夜视频| 99视频资源网| 国产精品999久久久| 能在线观看的av网站| 欧美国产精品久久| 狠狠色噜噜狠狠狠| gogogo免费视频观看亚洲一| a视频v在线| 综合天堂久久久久久久| 亚洲欧美偷拍自拍| 成人av免费网站| 亚洲精品免费观看| www插插插无码视频网站| 日韩欧美在线视频播放| 久久av高潮av无码av喷吹| 久久久噜噜噜久久中文字幕色伊伊| 中国极品少妇videossexhd| **亚洲第一综合导航网站| 国产成人精品亚洲午夜麻豆| 私人影视中文字幕| 日本最新一区二区三区视频观看| 欧美中在线观看| 成人精品一区二区不卡视频| 国产高清精品一区| 久久中文字幕av| 国产成人午夜电影| 日本一区二区三区免费乱视频| 一二三四视频在线社区中文字幕2| 中文字幕亚洲综合久久| 99国产在线播放| 国产精品蜜臀在线观看| 免费黄色网页| 丁香色欲久久久久久综合网| 亚洲自拍偷拍网| 国产精品久久久久国产精品日日| 激情五月婷婷综合| 亚洲一区二区三区四区在线观看| 中文字幕久久久av一区| 国产精品扒开腿做爽爽| 色av吧综合网| 啪啪激情综合网| 色婷婷一区二区三区四区| 邻居大乳一区二区三区| 国产亚洲精品美女久久| 日韩一区二区三区四区五区| 国产成人综合亚洲91猫咪| 搡老岳熟女国产熟妇| jiuse.com91视频| 日本成人动漫在线观看| 国产亚洲激情在线| 久久久久久福利| 亚洲中文字幕久久精品无码喷水| 欧美乱大交xxxxx潮喷l头像| 国产亚洲一本大道中文在线| 色欲综合视频天天天| 欧美激情亚洲综合一区| 国产一级二级视频| 欧美激情网址| 久久久久久蜜桃一区二区| 天天躁日日躁狠狠躁av| 亚洲欧美日本视频在线观看| 国产乱码精品一区二区三区卡| 国产麻豆xxxvideo实拍| 超碰caoporn久久| 国产男人精品视频| 国产精品一区二区三区av麻| 日韩有码免费视频| 天天摸日日摸狠狠添| 精品人妻一区二区三区换脸明星| 久久精品亚洲成在人线av网址| 一个人看的www视频免费在线观看| 老司机午夜网站| 欧美老女人性视频| 荡女精品导航| 欧美国产日本高清在线| 综合久久十次| 成人网18免费软件大全| 国产综合动作在线观看| 99久久伊人| 国产精品久久毛片| 污免费在线观看| 一区二区三区免费| 狠狠躁天天躁日日躁欧美| 中文字幕这里只有精品| 午夜黄色在线观看| 国产精品极品尤物在线观看| 欧美日韩一二区| 国产一级久久久| 成人黄色片在线观看| 国产不卡av在线播放| 国产精品99久久99久久久二8| 欧美一卡二卡三卡| 二区三区四区高清视频在线观看| 福利一区二区免费视频| 国产精品视频无码| 黄色一级a毛片| 国产精品精品软件男同| 亚洲伦伦在线| 国产视频三区四区| 亚洲人成网站在线在线观看| 国内精品视频| 日韩影片中文字幕| 欧美日韩国产免费一区二区三区| ccyy激情综合| 少妇精品视频一区二区免费看| 国产自产视频一区二区三区| 成人激情视屏| 亚洲国产成人私人影院| 久久riav二区三区| 欧美一区2区三区4区公司二百| 亚洲视频中文字幕在线观看| 国产又粗又猛又爽又黄91精品| 免费观看的av| 一区二区在线观看视频在线| 美女网站在线| 午夜精品久久久99热福利| 91热门视频在线观看| 一二三四日本中文字幕| 国产无遮挡在线观看| 黄色网页免费在线观看| 少妇太紧太爽又黄又硬又爽| 色影视在线观看| 超碰中文字幕在线观看| 欧美性感美女h网站在线观看免费| 波多野结衣电车痴汉| 超碰在线97国产| 国产精品成人观看视频免费| 日韩中文字幕在线视频观看| 五月婷婷激情五月| 国产乱国产乱老熟300部视频| 欧美日韩在线观看视频小说| 精品久久毛片| 日韩福利视频导航| 日本va欧美va精品| 成人黄色免费网| 日韩电影大全在线观看| 亚洲精品视频久久久| 2025中文字幕| 欧洲精品在线观看| 真实乱偷全部视频| 日本成人在线一区| 第一次破处视频| 亚洲靠逼com| 国产精品久久久久影院亚瑟| 热久久视久久精品18亚洲精品| 国产1区2区3区精品美女| 色偷偷网友自拍|