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

Redis--Geo指令的語法和使用場景舉例(附近的人功能)

這篇具有很好參考價值的文章主要介紹了Redis--Geo指令的語法和使用場景舉例(附近的人功能)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

  • Redis除了常見的五種數(shù)據(jù)類型之外,其實還有一些少見的數(shù)據(jù)結構,如Geo,HyperLogLog等。雖然它們少見,但是作用卻不容小覷。本文將介紹Geo指令的語法和使用場景。

Geo介紹

  • Geo是"geolocation"的縮寫,即地理定位器,顧名思義就是記錄地理位置信息,用來進行地址位置排序的數(shù)據(jù)結構。所以它場景的應用場景便是尋找附近的人,最佳路線推薦等等。
  • 說到地址位置排序,不得不提地理位置距離排序算法GeoHash算法,Redis也使用了這個算法。簡單來說,這個算法就是將某地點的經(jīng)度和緯度進行編碼之后,成為的一維整數(shù),整數(shù)越接近,兩個地點也就越接近。通過整數(shù)可以還原出經(jīng)緯度坐標,整數(shù)越長,還原出來的坐標損失程度就越小。GeoHash算法會繼續(xù)對這個整數(shù)做一次base32編碼,使其變成字符串。
  • 于是在使用Geo數(shù)據(jù)結構時,可以簡單地理解為,它只是一個zset,score是元素地址經(jīng)過GeoHash算法得到的52位整數(shù)(在Redis里面,經(jīng)緯度使用52位的整數(shù)進行編碼),value存放該元素。

Geo指令使用

  • 向Geo中添加地理空間信息:geoadd key 經(jīng)度 緯度 具體元素

    geoadd restaurant 95 20 "沙縣小吃"    
    geoadd restaurant 96 19 "肯德基" 120 27 "麥當勞"
    
  • 返回指定兩個元素的距離:geodist key 元素1 元素2 距離單位

    geodist restaurant "沙縣小吃" "肯德基" km
    
  • 獲取元素坐標:geopos key 元素1 … 元素n

    geopos restaurant "麥當勞"
    geopos restaurant "沙縣小吃" "肯德基"
    
  • 獲取指定元素坐標的hash字符串:geohash key 元素1

    geohash restaurant "沙縣小吃"  
    

    獲取到的hash值可以到 http://geohash.org/${hash} 上進行定位,得到經(jīng)緯度坐標

    Redis--Geo指令的語法和使用場景舉例(附近的人功能),Redis,redis,數(shù)據(jù)庫,緩存

  • 指定圓心半徑,找到該圓范圍內(nèi)的所有元素,并按與圓心距離排序后返回:georadius key 經(jīng)度 緯度 半徑 單位 withdist/withcoord/withhash count n des/asc

    georadius restaurant 95 21 100 km withdist count 3 asc # 查找經(jīng)度95 緯度21的地點半徑100公里以內(nèi)的餐館,正序輸出三個餐館
    

    withdist: 同時返回該元素與圓心的距離,距離單位為georadius指令指定的單位
    withhash: 同時返回52位整數(shù)編碼后的字符串
    withcoord: 同時返回該元素的經(jīng)緯度坐標

使用場景:附近的人

  • 需求:實現(xiàn)查看附近的人功能。

  • 實現(xiàn)方案:使用geo數(shù)據(jù)結構,將用戶的位置經(jīng)緯度保存在geo中,然后對這些信息進行查詢。

  • 代碼實現(xiàn):代碼中saveUserLocation()方法負責添加用戶位置信息,在添加時使用outOfChina()方法判斷做位置檢驗,是否用戶位置在國內(nèi),不在國內(nèi)就不保存了,deleteUserLocation()方法負責刪除某用戶的位置信息,getNearByLocation()方法負責查詢某個地方附近的用戶。

    public class NearbyPeopleDemo {
    
        public static void main(String[] args) {
            Jedis jedis = new Jedis("127.0.0.1");
            jedis.del(LOCATION_KEY);
            double lon ;
            double lat ;
            //向redis中存放用戶的地址,隨機生成一萬個用戶。
            for(int i = 0;i<10000;i++){
                lon = Math.random()*(138-72+1)+72;
                lat = Math.random()*(55-0+1);
                //判斷該位置是否屬于中國,不屬于就不加了
                if(!outOfChina(lon,lat)) {
                    saveUserLocation("用戶"+i, lon, lat, jedis);
                }
            }
            System.out.println("添加用戶位置信息完畢!");
            System.out.println("距離經(jīng)度100,緯度35位置100km以內(nèi)的人有哪些:"+
                    getNearByLocation(100, 35, 100, jedis));
        }
        private static final String LOCATION_KEY = "location";
    
        /**
         * 保存用戶位置信息
         * @param userId 用戶id
         * @param longitude 經(jīng)度
         * @param latitude 緯度
         * @param jedis
         */
        public static void saveUserLocation(String userId, double longitude, double latitude, Jedis jedis){
            jedis.geoadd(LOCATION_KEY,longitude,latitude,userId);
        }
    
        /**
         * 根據(jù)用戶id刪除用戶位置信息,采用zset的刪除方式刪除即可
         * @param userId
         * @param jedis
         */
        public static void deleteUserLocation(String userId,Jedis jedis){
            jedis.zrem(LOCATION_KEY,userId);
        }
    
        /**
         * 查詢附近的人
         * @param longitude 經(jīng)度
         * @param latitude 緯度
         * @param radius 半徑
         * @param jedis
         * @return
         */
        public static List<String> getNearByLocation(double longitude, double latitude,double radius,Jedis jedis){
            List<GeoRadiusResponse> georadius = jedis.georadius(LOCATION_KEY, longitude, latitude, radius, GeoUnit.KM);
            return georadius.stream().map(GeoRadiusResponse::getMemberByString).collect(Collectors.toList());
        }
    
        /**
         * 判斷經(jīng)緯度是否超過了中國
         * @param longitude 經(jīng)度
         * @param latitude 緯度
         * @return
         */
        public static boolean outOfChina(double longitude,double latitude)
        {
            if (longitude < 72.004 || longitude > 137.8347)
                return true;
            if (latitude < 0.8293 || latitude > 55.8271)
                return true;
            return false;
        }
    
    }
    
  • 測試結果:我們在main方法中,隨機生成一萬個用戶位置信息,保存在redis中,之后調(diào)用getNearByLocation()方法查找距離經(jīng)度100,緯度35的位置100km以內(nèi)的人有哪些,運行結果如下:
    Redis--Geo指令的語法和使用場景舉例(附近的人功能),Redis,redis,數(shù)據(jù)庫,緩存文章來源地址http://www.zghlxwxcb.cn/news/detail-806582.html

參考文獻

  • 《91.Redis深度歷險 核心原理與應用實踐》–錢文品

到了這里,關于Redis--Geo指令的語法和使用場景舉例(附近的人功能)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • java實戰(zhàn):Redis實現(xiàn)查找附近的人

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

    2024年02月21日
    瀏覽(19)
  • 【案例實戰(zhàn)】SpringBoot整合Redis的GEO實現(xiàn)查找附近門店功能

    【案例實戰(zhàn)】SpringBoot整合Redis的GEO實現(xiàn)查找附近門店功能

    像我們平常美團點外賣的時候,都會看到一個商家距離我們多少米。還有類似QQ附近的人,我們能看到附近的人距離我們有多少米。 那么這些業(yè)務是怎么做的呢?是如何實現(xiàn) 基于位置的附近服務 系統(tǒng)呢。 在去了解基于位置的附近服務之前,我們先來看一下什么是GIS技術。

    2024年02月10日
    瀏覽(18)
  • Redis--Zset使用場景舉例(滑動窗口實現(xiàn)限流)

    Redis--Zset使用場景舉例(滑動窗口實現(xiàn)限流)

    前言 在Redis–Zset的語法和使用場景舉例(朋友圈點贊,排行榜)一文中,提及了redis數(shù)據(jù)結構zset的指令語法和一些使用場景,今天我們使用zset來實現(xiàn)滑動窗口限流,詳見下文。 什么是滑動窗口 滑動窗口是一種流量控制策略,用于控制一定時間內(nèi)請求的訪問數(shù)量。 其原理是

    2024年01月19日
    瀏覽(28)
  • SQL的五大約束作用、語法、應用場景及舉例

    SQL的五大約束包括 主鍵約束(PRIMARY KEY)、唯一性約束(UNIQUE)、外鍵約束(FOREIGN KEY)、非空約束(NOT NULL)和默認約束(DEFAULT) 。 sql約束的作用:主要是 保證數(shù)據(jù)的完整性、準確性和一致性 ,從而 確保 數(shù)據(jù)庫中存儲的 數(shù)據(jù)質量 。 溫馨提示:以下舉例為mysql版本,若您

    2024年01月21日
    瀏覽(54)
  • Redis常用命令指令、描述及簡單舉例

    指令 描述 舉例 set 存入單個數(shù)據(jù) set number 1 setex 存入并設置過期時間 setex key 30 value setnx 不存在則存入,實現(xiàn)分布式鎖 setnx key value msetnx 不存在則批量存入,原子性操作 msetnx key1 value1 key2 value2 有一個key存在則整個語句插入失敗 mset 批量存入數(shù)據(jù) mset key1 1 key2 2 get 獲取單個數(shù)據(jù)

    2024年01月22日
    瀏覽(20)
  • MySQL 實戰(zhàn)(一):實現(xiàn)“附近的人”功能

    MySQL 實戰(zhàn)(一):實現(xiàn)“附近的人”功能

    ?? 個人主頁:水滴技術 ?? 支持水滴: 點贊 ?? + 收藏 ? + 留言 ?? ?? 訂閱專欄:MySQL 教程:從入門到精通 大家好,我是水滴~~ 對于“附近的人”功能,在生活中是比較常用的,像外賣app附近的美食,共享單車app里附近的車輛等等。我們之前使用 ElasticSearch 實現(xiàn)過該功

    2024年02月11日
    瀏覽(21)
  • prisma 結合 mongodb 查詢地理空間坐標,實現(xiàn) “附近的人”功能

    prisma 結合 mongodb 查詢地理空間坐標,實現(xiàn) “附近的人”功能

    前言:我們創(chuàng)建一個集合,添加測試數(shù)據(jù),并執(zhí)行 mongodb 的地理空間查詢,返回需要的數(shù)據(jù)。 1、通過 schema.prisma , 創(chuàng)建 store 集合 2、通過 prisma/client ,插入 幾條測試數(shù)據(jù) location 的數(shù)據(jù)格式為 GeoJSON ,即地理位置信息的 JSON 表示法。 這里 type 指定類型為 點坐標 , coordinates

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

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

    2024年02月06日
    瀏覽(25)
  • 如何使用Redis實現(xiàn)附近商家查詢

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

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

    2024年02月12日
    瀏覽(26)
  • 阿里云服務器可以做什么?十大使用場景舉例說明

    阿里云服務器可以做什么?十大使用場景舉例說明

    使用阿里云服務器可以做什么?阿里云百科分享使用阿里云服務器常用的十大使用場景,說是十大場景實際上用途有很多,阿里云百科分享常見的云服務器使用場景,如本地搭建ChatGPT、個人網(wǎng)站或博客、運維測試、學習Linux、跑Python、小程序服務器等等,阿小云分享使用阿里

    2024年02月10日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包