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

【Redis】GEO數(shù)據(jù)類型之附近的店鋪實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了【Redis】GEO數(shù)據(jù)類型之附近的店鋪實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一、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

1、概念

GEO全稱Geolocation,Redis種的一種數(shù)據(jù)結(jié)構(gòu)他代表地理坐標(biāo)

2、相關(guān)命令

1.GEOADD

向redis中添加一個(gè)地理空間信息,其中包含經(jīng)度、維度、值(member)

2.GEODIST

計(jì)算兩個(gè)指定點(diǎn)之間的距離并返回

3.GEOHASH

將指定member的坐標(biāo)轉(zhuǎn)為hash字符串形式并返回

4.GEOPOS

返回指定member的左邊

5.GEORADIUS

指定圓心、半徑、找到該圓內(nèi)包含的所有member,并按照與圓心之間的距離排序后返回。6.2以后已經(jīng)廢棄

6.GEOSEARCH

在指定的范圍內(nèi)搜索member,并按照與指定點(diǎn)之間的距離進(jìn)行排序后返回,這個(gè)范圍可以是矩形也可以是圓形

7.GEOSEARCHSTORE

與第六個(gè)相同,不過該命令可以將結(jié)果存儲(chǔ)到一個(gè)指定的key中

二、附近的店鋪

1、實(shí)現(xiàn)思路

在數(shù)據(jù)庫(kù)層面,我們?cè)诘赇伇砩暇S護(hù)兩個(gè)字段分別是x、y對(duì)應(yīng)經(jīng)緯度,然后將這些店鋪的類型id作為geo數(shù)據(jù)類型的key將該類型對(duì)應(yīng)的店鋪id作為member以及經(jīng)緯度xy存入member對(duì)應(yīng)的經(jīng)緯度中,首先我們需要將查出來的店鋪信息通過代碼(推薦使用Stream流)將相同類型店鋪存的id作為key在同一個(gè)的map中,然后遍歷該集合以類型id作為redis的key的組成,將店鋪id與經(jīng)緯度存入geo中,此時(shí)當(dāng)客戶端傳來要查詢的店鋪類型與用戶自身的地理位置時(shí),我們只需要通過上述geo數(shù)據(jù)結(jié)構(gòu)來處理按照距離由近到遠(yuǎn)的返回店鋪id結(jié)合,然后查詢數(shù)據(jù)庫(kù)將該id對(duì)應(yīng)的店鋪信息查出后設(shè)置他們各自的距離后返回給前端文章來源地址http://www.zghlxwxcb.cn/news/detail-468068.html

2、代碼實(shí)現(xiàn)

List<Shop> test(Integer typeId, Integer page, Integer size, Double x, Double y) {
        // 參數(shù)中  typeId為類型id   page當(dāng)前頁(yè)數(shù)   size每頁(yè)數(shù)據(jù)量  x經(jīng)度  y維度
        // 首先判斷是否需要根據(jù)坐標(biāo)查詢:判斷客戶端是否傳回用戶的地理位置
        if (x == null || y == null) {
            // 不需要按照地理位置查詢,則進(jìn)行正常分頁(yè)查詢
            // TODO:調(diào)用mapper層查詢數(shù)據(jù)庫(kù)
            return null;
        }
        
        // 2.計(jì)算分頁(yè)參數(shù)
        int from = (page - 1) * size;
        int end = page * size;
        
        // 3.查詢r(jià)edis 根據(jù)距離排序
        String key = "shop:geo:" + typeId;
        GeoResults<RedisGeoCommands.GeoLocation<String>> search = stringRedisTemplate.opsForGeo()
                .search(
                    key,                            // key 
                    GeoReference.fromCoordinate(new Point(x, y)),  // 中心點(diǎn)的經(jīng)緯度
                    new Distance(5000),                     // 查詢范圍單位默認(rèn)是m
                    RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end) // 將距離返回查詢到end
        );
        if (search == null) return null;

        // 4.截取需要的數(shù)據(jù)
        List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = search.getContent();
        if (content.size() < from) {
            // 沒有下一頁(yè)了
            return null;
        }
        List<Long> ids = new ArrayList<>(content.size());                   // 存儲(chǔ)用戶id
        Map<String,Distance> distanceMap = new HashMap<>(content.size());   // 存儲(chǔ)距離
        // 截取相應(yīng)的部分
        content.stream().skip(from).forEach(re -> {
            // 獲取id
            String shopIdStr = re.getContent().getName();
            ids.add(Long.valueOf(shopIdStr));
            // 獲取距離
            Distance distance = re.getDistance();
            distanceMap.put(shopIdStr,distance);
        });
        
        // 根據(jù)id去查詢對(duì)應(yīng)的店鋪
        List<Shop> dbShops = shopMapper.queryById(ids);
        // 將對(duì)應(yīng)的距離賦值給每個(gè)shop對(duì)象后返回
        for (Shop shop:dbShops) {
            shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());
        }
        
        return dbShops;
    }

到了這里,關(guān)于【Redis】GEO數(shù)據(jù)類型之附近的店鋪實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 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)
  • 如何使用Redis實(shí)現(xiàn)附近商家查詢

    如何使用Redis實(shí)現(xiàn)附近商家查詢

    ????宏夏Coding網(wǎng)站,致力于為編程學(xué)習(xí)者、互聯(lián)網(wǎng)求職者提供最需要的內(nèi)容!網(wǎng)站內(nèi)容包括求職秘籍,葵花寶典(學(xué)習(xí)筆記),資源推薦等內(nèi)容。在線閱讀:https://hongxiac.com???? 在日常生活中,我們經(jīng)常能看見查詢附近商家的功能。 常見的場(chǎng)景有,比如你在點(diǎn)外賣的時(shí)候

    2024年02月12日
    瀏覽(26)
  • java實(shí)戰(zhàn):Redis實(shí)現(xiàn)查找附近的人

    本文將介紹如何使用Redis實(shí)現(xiàn)查找附近的人的功能。我們將探討如何使用Redis的地理空間(Geospatial)索引功能,并展示一個(gè)簡(jiǎn)單的Java代碼示例,該示例使用Jedis庫(kù)和Redis的GEOADD命令來添加位置信息,以及使用GEORADIUS命令來查找附近的人。通過本文,可以了解到如何在Java應(yīng)用程

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

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

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

    2024年02月02日
    瀏覽(21)
  • redis7高級(jí)篇3 數(shù)據(jù)量?jī)|級(jí)別的統(tǒng)計(jì)分析(hyperloglog,bitmap,geo)

    redis7高級(jí)篇3 數(shù)據(jù)量?jī)|級(jí)別的統(tǒng)計(jì)分析(hyperloglog,bitmap,geo)

    1.聚合統(tǒng)計(jì):統(tǒng)計(jì)多個(gè)集合聚合的結(jié)果,也就是多個(gè)集合之間交并差的統(tǒng)計(jì)。 2.排序統(tǒng)計(jì):在需要展示最新列表,排行榜等場(chǎng)景時(shí),如果數(shù)據(jù)更新頻繁或者需要分頁(yè)時(shí),建議使用zset127.0.0.1:6379 zadd pl ?111222 beijing 111223 tianjing 111333 shanghai (integer) 3 127.0.0.1:6379 zrange pl 0 1 1) \\\"beijin

    2024年02月11日
    瀏覽(40)
  • 「Redis」1. 數(shù)據(jù)類型的底層實(shí)現(xiàn)

    「Redis」1. 數(shù)據(jù)類型的底層實(shí)現(xiàn)

    前言:在這篇博文中,我們將簡(jiǎn)單總結(jié)在面試中怎么回答Redis數(shù)據(jù)類型的底層實(shí)現(xiàn)。 因?yàn)槊嬖嚂r(shí)間就那么點(diǎn),言簡(jiǎn)意賅的描述自己會(huì)的知識(shí)顯得尤為重要?? ?? 作者簡(jiǎn)介:作為某云服務(wù)提供商的后端開發(fā)人員,我將在這里與大家簡(jiǎn)要分享一些實(shí)用的開發(fā)小技巧。在我的職業(yè)

    2024年02月10日
    瀏覽(20)
  • Redis - 附近商鋪、用戶簽到、UV統(tǒng)計(jì)

    Redis - 附近商鋪、用戶簽到、UV統(tǒng)計(jì)

    底層都是基于地理坐標(biāo)進(jìn)行搜索,支持地理坐標(biāo)的技術(shù)有很多,Redis就是其中之一 GEO 就是Geolocation的簡(jiǎn)寫形式,代表 地理坐標(biāo) 。 Redis 在3.2版本中加入了對(duì)GEO的支持, 允許存儲(chǔ)地理坐標(biāo)信息 ,幫助我們根據(jù)經(jīng)緯度來檢索數(shù)據(jù)。 常見的命令有 : GEOADD :添加一個(gè)地理空間信息,

    2024年02月13日
    瀏覽(21)
  • Elasticsearch集群搭建、數(shù)據(jù)分片以及位置坐標(biāo)實(shí)現(xiàn)附近的人搜索

    es使用兩種不同的方式來發(fā)現(xiàn)對(duì)方: 廣播 單播 也可以同時(shí)使用兩者,但默認(rèn)的廣播,單播需要已知節(jié)點(diǎn)列表來完成 當(dāng)es實(shí)例啟動(dòng)的時(shí)候,它發(fā)送了廣播的ping請(qǐng)求到地址 224.2.2.4:54328 。而其他的es實(shí)例使用同樣的集群名稱響應(yīng)了這個(gè)請(qǐng)求。 一般這個(gè)默認(rèn)的集群名稱就是上面的

    2024年02月06日
    瀏覽(25)
  • Redis GEO功能詳細(xì)介紹與實(shí)戰(zhàn)

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

    Redis的Geo功能主要用于存儲(chǔ)地理位置信息,并對(duì)其進(jìn)行操作。該功能在Redis 3.2版本新增。Redis Geo操作方法包括: geoadd:添加地理位置的坐標(biāo); geopos:獲取地理位置的坐標(biāo); geodist:計(jì)算兩個(gè)位置之間的距離; georadius:根據(jù)用戶給定的經(jīng)緯度坐標(biāo)來獲取指定范圍內(nèi)的地理位置集

    2024年02月07日
    瀏覽(27)
  • 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日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包