国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis GEO功能詳細(xì)介紹與實(shí)戰(zhàn)

這篇具有很好參考價(jià)值的文章主要介紹了Redis GEO功能詳細(xì)介紹與實(shí)戰(zhàn)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、概述

Redis的Geo功能主要用于存儲(chǔ)地理位置信息,并對其進(jìn)行操作。該功能在Redis 3.2版本新增。Redis Geo操作方法包括:

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

二、Redis Geo功能案例:

1、案例1

查找某個(gè)城市下的門店信息。
比如有的一家門店存儲(chǔ)的Redis結(jié)構(gòu)如下:

store:   
  - member: poscon  
  - member: shangxixxi

其中poscon表示該門店的坐標(biāo)信息,shangxixxi表示該門店的名稱。

現(xiàn)在需要查找某個(gè)城市下的門店信息,可以使用Redis的Geo功能實(shí)現(xiàn):

GEOADD store 116.406890 39.909195 "poscon" "shangxixxi"  
GEOADD store 116.420853 39.892662 "poscon1" "shangxixxi1"  
GEOADD store 116.401415 39.915726 "poscon2" "shangxixxi2"  
GEOADD store 116.426988 39.919938 "poscon3" "shangxixxi3"  
GEOADD store 116.410057 39.904425 "poscon4" "shangxixxi4"  
GEORADIUS store 116.409729 39.908256 10000km WITHCOORD WITHDIST

以上代碼表示在(116.409729, 39.908256)半徑為10000km的圓內(nèi)查找門店信息,返回結(jié)果會(huì)包含每個(gè)門店的坐標(biāo)信息和距離??梢愿鶕?jù)返回結(jié)果篩選出自己需要的門店信息。

2、案例2

添加下面幾條數(shù)據(jù):

  • 北京南站 ( 116.378248 39.865275
  • 北京站 ( 116.42803 39.903738 )
  • 北京西站(116.322287 39.893729 )
127.0.0.1:6379> GEOADD g1 116.378248 39.865275 bjn 116.42803 39.903738 bjz 116.322287 39.893729 bjx
(integer) 3
  1. 計(jì)算北京西站到北京站的距離
127.0.0.1:6379> GEODIST g1 bjz bjx km
"9.0916"
  1. 搜索天安門(116.397904 39.909005 )附近1km內(nèi)的所有火車站,并按照距離升序排序
127.0.0.1:6379> GEOSEARCH g1 FROMLONLAT 116.397904 39.909005 BYRADIUS 10 km WITHDIST
1) 1) "bjz"
   2) "2.6361"
2) 1) "bjn"
   2) "5.1452"
3) 1) "bjx"
   2) "6.6723"
  1. 計(jì)算北京西的坐標(biāo)與hash值
127.0.0.1:6379> GEOPOS g1 bjz
1) 1) "116.42802804708480835"
   2) "39.90373880538094653"
127.0.0.1:6379> GEOHASH g1 bjz
1) "wx4g12k21s0"

三、實(shí)戰(zhàn)搜索附近商鋪

1、接口名稱

Redis GEO功能詳細(xì)介紹與實(shí)戰(zhàn)

2、商家列表展示距離

當(dāng)我們點(diǎn)擊美食之后,會(huì)出現(xiàn)一系列的商家,商家中可以按照多種排序方式,我們此時(shí)關(guān)注的是距離,這個(gè)地方就需要使用到我們的GEO,向后臺(tái)傳入當(dāng)前app收集的地址(我們此處是寫死的) ,以當(dāng)前坐標(biāo)作為圓心,同時(shí)綁定相同的店家類型type,以及分頁信息,把這幾個(gè)條件傳入后臺(tái),后臺(tái)查詢出對應(yīng)的數(shù)據(jù)再返回。
如圖:
Redis GEO功能詳細(xì)介紹與實(shí)戰(zhàn)

3、約定數(shù)據(jù)存儲(chǔ)規(guī)則

Redis GEO功能詳細(xì)介紹與實(shí)戰(zhàn)
我們要做的事情是:將數(shù)據(jù)庫表中的數(shù)據(jù)導(dǎo)入到redis中去,redis中的GEO,GEO在redis中就一個(gè)menber和一個(gè)經(jīng)緯度,我們把x和y軸傳入到redis做的經(jīng)緯度位置去,但我們不能把所有的數(shù)據(jù)都放入到menber中去,畢竟作為redis是一個(gè)內(nèi)存級數(shù)據(jù)庫,如果存海量數(shù)據(jù),redis還是力不從心,所以我們在這個(gè)地方存儲(chǔ)他的id即可。

但是這個(gè)時(shí)候還有一個(gè)問題,就是在redis中并沒有存儲(chǔ)type,所以我們無法根據(jù)type來對數(shù)據(jù)進(jìn)行篩選,所以我們可以按照商戶類型做分組,類型相同的商戶作為同一組,以typeId為key存入同一個(gè)GEO集合中即可

  • 測試:
void loadShopData() {
    // 1.查詢店鋪信息
    List<Shop> list = shopService.list();
    // 2.把店鋪分組,按照typeId分組,typeId一致的放到一個(gè)集合
    Map<Long, List<Shop>> map = list.stream().collect(Collectors.groupingBy(Shop::getTypeId));
    // 3.分批完成寫入Redis
    for (Map.Entry<Long, List<Shop>> entry : map.entrySet()) {
        // 3.1.獲取類型id
        Long typeId = entry.getKey();
        String key = SHOP_GEO_KEY + typeId;
        // 3.2.獲取同類型的店鋪的集合
        List<Shop> value = entry.getValue();
        List<RedisGeoCommands.GeoLocation<String>> locations = new ArrayList<>(value.size());
        // 3.3.寫入redis GEOADD key 經(jīng)度 緯度 member
        for (Shop shop : value) {
            // stringRedisTemplate.opsForGeo().add(key, new Point(shop.getX(), shop.getY()), shop.getId().toString());
            locations.add(new RedisGeoCommands.GeoLocation<>(
                    shop.getId().toString(),
                    new Point(shop.getX(), shop.getY())
            ));
        }
        stringRedisTemplate.opsForGeo().add(key, locations);
    }
}
  • 結(jié)果:
    Redis GEO功能詳細(xì)介紹與實(shí)戰(zhàn)

4、實(shí)現(xiàn)附近商戶功能

4.1 第一步:導(dǎo)入pom
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>spring-data-redis</artifactId>
            <groupId>org.springframework.data</groupId>
        </exclusion>
        <exclusion>
            <artifactId>lettuce-core</artifactId>
            <groupId>io.lettuce</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.6.2</version>
</dependency>
<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>6.1.6.RELEASE</version>
</dependency>
4.2 第二步:寫接口ShopController

傳入?yún)?shù):

  • typeId:商品類型id
  • current: 當(dāng)前頁碼
  • x : 經(jīng)度
  • y : 緯度
@GetMapping("/of/type")
public Result queryShopByType(
        @RequestParam("typeId") Integer typeId,
        @RequestParam(value = "current", defaultValue = "1") Integer current,
        @RequestParam(value = "x", required = false) Double x,
        @RequestParam(value = "y", required = false) Double y
) {
   return shopService.queryShopByType(typeId, current, x, y);
}
4.3 第三步:實(shí)現(xiàn)
  1. 判斷是否需要根據(jù)坐標(biāo)查詢
  2. 計(jì)算分頁參數(shù)
  3. 查詢r(jià)edis、按照距離排序、分頁。結(jié)果:shopId、distance
  4. 解析出id
  5. 根據(jù)id查詢Shop
  6. 返回店鋪數(shù)據(jù)
@Override
    public Result queryShopByType(Integer typeId, Integer current, Double x, Double y) {
        // 1.判斷是否需要根據(jù)坐標(biāo)查詢
        if (x == null || y == null) {
            // 不需要坐標(biāo)查詢,按數(shù)據(jù)庫查詢
            Page<Shop> page = query()
                    .eq("type_id", typeId)
                    .page(new Page<>(current, SystemConstants.DEFAULT_PAGE_SIZE));
            // 返回?cái)?shù)據(jù)
            return Result.ok(page.getRecords());
        }

        // 2.計(jì)算分頁參數(shù)
        int from = (current - 1) * SystemConstants.DEFAULT_PAGE_SIZE;
        int end = current * SystemConstants.DEFAULT_PAGE_SIZE;

        // 3.查詢r(jià)edis、按照距離排序、分頁。結(jié)果:shopId、distance
        String key = SHOP_GEO_KEY + typeId;
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = stringRedisTemplate.opsForGeo() // GEOSEARCH key BYLONLAT x y BYRADIUS 10 WITHDISTANCE
                .search(
                        key,
                        GeoReference.fromCoordinate(x, y),
                        new Distance(5000),
                        RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end)
                );
        // 4.解析出id
        if (results == null) {
            return Result.ok(Collections.emptyList());
        }
        List<GeoResult<RedisGeoCommands.GeoLocation<String>>> list = results.getContent();
        if (list.size() <= from) {
            // 沒有下一頁了,結(jié)束
            return Result.ok(Collections.emptyList());
        }
        // 4.1.截取 from ~ end的部分
        List<Long> ids = new ArrayList<>(list.size());
        Map<String, Distance> distanceMap = new HashMap<>(list.size());
        list.stream().skip(from).forEach(result -> {
            // 4.2.獲取店鋪id
            String shopIdStr = result.getContent().getName();
            ids.add(Long.valueOf(shopIdStr));
            // 4.3.獲取距離
            Distance distance = result.getDistance();
            distanceMap.put(shopIdStr, distance);
        });
        // 5.根據(jù)id查詢Shop
        String idStr = StrUtil.join(",", ids);
        List<Shop> shops = query().in("id", ids).last("ORDER BY FIELD(id," + idStr + ")").list();
        for (Shop shop : shops) {
            shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());
        }
        // 6.返回
        return Result.ok(shops);
    }

四、源碼下載

https://gitee.com/charlinchenlin/koo-erp文章來源地址http://www.zghlxwxcb.cn/news/detail-470177.html

到了這里,關(guān)于Redis GEO功能詳細(xì)介紹與實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • API低代碼平臺(tái)介紹1-功能概述

    API低代碼平臺(tái)介紹1-功能概述

    ??ADI平臺(tái)是指Application data integration,即“應(yīng)用數(shù)據(jù)集成”,使用springboot開發(fā),并通過springcloud實(shí)現(xiàn)微服務(wù),是一個(gè)動(dòng)態(tài)定義Http API接口的“零代碼”或“低代碼”平臺(tái),支持GET(查)、POST(增)、PUT(改)、DELETE(刪)四種請求方式直接操作數(shù)據(jù)庫數(shù)據(jù);可動(dòng)態(tài)添加多個(gè)數(shù)據(jù)源(實(shí)現(xiàn)原

    2024年02月06日
    瀏覽(21)
  • Redis Geo:掌握地理空間數(shù)據(jù)的藝術(shù)

    Redis Geo:掌握地理空間數(shù)據(jù)的藝術(shù)

    歡迎來到我的博客,代碼的世界里,每一行都是一個(gè)故事 在移動(dòng)互聯(lián)網(wǎng)和物聯(lián)網(wǎng)的時(shí)代,地理位置數(shù)據(jù)無處不在。從導(dǎo)航和配送到社交網(wǎng)絡(luò)和廣告,地理位置信息正在重新定義我們與世界的互動(dòng)方式。但是,處理和分析這些大量的地理空間數(shù)據(jù)絕非易事。這時(shí),Redis Geo應(yīng)運(yùn)而

    2024年02月02日
    瀏覽(21)
  • Redis GEO地理位置信息的應(yīng)用

    Redis GEO地理位置信息的應(yīng)用

    Redis的GEO操作是一種基于地理位置信息進(jìn)行操作的功能。它使用經(jīng)度和緯度坐標(biāo)來表示地理位置,支持存儲(chǔ)地理位置信息用來實(shí)現(xiàn)諸如附近位置、搖一搖這類依賴于地理位置信息的功能。 1.GEOADD添加位置信息 將一個(gè)或多個(gè)指定的地理位置(經(jīng)度、緯度、名稱)添加到指定的鍵

    2024年02月08日
    瀏覽(20)
  • 【Redis】特殊數(shù)據(jù)類型 Geo (地理位置)

    【Redis】特殊數(shù)據(jù)類型 Geo (地理位置)

    除了五中基本的數(shù)據(jù)類型外,Redis還支持兩種特殊的數(shù)據(jù)類型,第一種 Geo (地理位置):用于存儲(chǔ)地理位置相關(guān)的數(shù)據(jù),例如經(jīng)緯度、距離等。第二種 Stream (流):是一個(gè)高級的列表類型,支持對列表的批量操作,如添加多個(gè)元素、獲取多個(gè)元素等。 Redis GEO(Geo Redis)是一個(gè)用

    2024年02月15日
    瀏覽(16)
  • BurpSuite超詳細(xì)安裝教程-功能概述-配置-使用教程---(附下載鏈接)

    BurpSuite超詳細(xì)安裝教程-功能概述-配置-使用教程---(附下載鏈接)

    BurpSuite是滲透測試、漏洞挖掘以及Web應(yīng)用程序測試的最佳工具之一,是一款用于攻擊web 應(yīng)用程序的集成攻擊測試平臺(tái),可以進(jìn)行抓包、重放、爆破,包含許多工具,能處理對應(yīng)的HTTP消息、持久性、認(rèn)證、代理、日志、警報(bào)。 鏈接: 百度網(wǎng)盤鏈接 提取碼:ranz 下載后解壓 如

    2024年02月03日
    瀏覽(27)
  • 【Redis】GEO數(shù)據(jù)類型之附近的店鋪實(shí)現(xiàn)

    目錄 一、GEO 1、概念 2、相關(guān)命令 1.GEOADD 2.GEODIST 3.GEOHASH 4.GEOPOS 5.GEORADIUS 6.GEOSEARCH 7.GEOSEARCHSTORE 二、附近的店鋪 1、實(shí)現(xiàn)思路 2、代碼實(shí)現(xiàn) GEO全稱Geolocation,Redis種的一種數(shù)據(jù)結(jié)構(gòu)他代表地理坐標(biāo) 1.GEOADD 向redis中添加一個(gè)地理空間信息,其中包含經(jīng)度、維度、值(member) 2.GEODI

    2024年02月07日
    瀏覽(25)
  • GEO數(shù)據(jù)挖掘(一)基礎(chǔ)介紹

    GEO數(shù)據(jù)挖掘(一)基礎(chǔ)介紹

    生信技能樹學(xué)徒學(xué)習(xí)第二周 一、GEO數(shù)據(jù)庫簡介 ? ? ? ?GEO全稱Gene Expression Omnibus data base,由美國國立生物技術(shù)信息中心NCBI創(chuàng)建并維護(hù)的基因表達(dá)數(shù)據(jù)庫(通過NCBI首頁,All Databases下拉框中選擇GEO DataSets)。收錄了世界各國研究機(jī)構(gòu)提交的高通量基因表達(dá)數(shù)據(jù)。2000年開始建立的時(shí)

    2024年02月13日
    瀏覽(20)
  • Redis GEO 類型與 API 結(jié)合,地理位置優(yōu)化的絕佳實(shí)踐

    Redis GEO 類型與 API 結(jié)合,地理位置優(yōu)化的絕佳實(shí)踐

    ?? 嗨,您好 ?? 我是 vnjohn,在互聯(lián)網(wǎng)企業(yè)擔(dān)任 Java 開發(fā),CSDN 優(yōu)質(zhì)創(chuàng)作者 ?? 推薦專欄:Spring、MySQL、Nacos、Java,后續(xù)其他專欄會(huì)持續(xù)優(yōu)化更新迭代 ??文章所在專欄:MySQL、Redis、業(yè)務(wù)設(shè)計(jì) ?? 我當(dāng)前正在學(xué)習(xí)微服務(wù)領(lǐng)域、云原生領(lǐng)域、消息中間件等架構(gòu)、原理知識(shí) ?? 向我

    2024年02月08日
    瀏覽(19)
  • 【微信小程序 | 實(shí)戰(zhàn)開發(fā)】ES5、ES6概述和新特性介紹

    【微信小程序 | 實(shí)戰(zhàn)開發(fā)】ES5、ES6概述和新特性介紹

    個(gè)人名片: ?? 作者簡介:一名大二在校生,喜歡編程?? ????? 個(gè)人主頁??: 小新愛學(xué)習(xí). ?? 個(gè)人WeChat:hmmwx53 ??? 系列專欄:??? 零基礎(chǔ)學(xué)Java——小白入門必備 重識(shí)C語言——復(fù)習(xí)回顧

    2024年02月09日
    瀏覽(14)
  • 【Redis】Redis是什么、能干什么、主要功能和工作原理的詳細(xì)講解

    【Redis】Redis是什么、能干什么、主要功能和工作原理的詳細(xì)講解

    ??歡迎來到本文?? ??個(gè)人簡介:陳童學(xué)哦,目前學(xué)習(xí)C/C++、算法、Python、Java等方向,一個(gè)正在慢慢前行的普通人。 ??系列專欄:陳童學(xué)的日記 ??其他專欄:C++STL,感興趣的小伙伴可以看看。 ??希望各位→點(diǎn)贊?? + 收藏?? + 留言?? ? ??萬物從心起,心動(dòng)則萬物動(dòng)??

    2024年02月11日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包