日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis 的geo地理位置及实现附近的人的功能

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis 的geo地理位置及实现附近的人的功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

redis在3.2版本里面新增的一個功能就是對GEO(地理位置)的支持。

理位置大概提供了6個命令,分別為:

  • GEOADD
  • GEODIST
  • GEOHASH
  • GEOPOS
  • GEORADIUS
  • GEORADIUSBYMEMBER

它只是一個普通的zset結構。

1.geoadd?: 添加一個地理位置

//geoadd : (緯度、經度、名稱)三元組 redisTemplate.opsForGeo().add("home", new Point(116.48105, 39.996794), "張三"); redisTemplate.opsForGeo().add("home", new Point(116.514203, 39.905409), "李四"); redisTemplate.opsForGeo().add("home", new Point(116.489033, 40.007669), "王五");

2.geodist : 計算兩個元素之間的距離

//計算張三李四之間的距離 其中,距離單位可以是m、km、ml、ft,分別代表米、千米、英里和尺 Distance distance = redisTemplate.opsForGeo().distance("home", "張三", "李四"); Distance distance2 = redisTemplate.opsForGeo().distance("home", "張三", "李四", RedisGeoCommands.DistanceUnit.KILOMETERS); System.out.println(distance); System.out.println(distance2.getValue());

3.geohash : 獲取元素經緯度坐標經過geohash算法生成的base32編碼值

List<String> hash = redisTemplate.opsForGeo().hash("home", "張三"); List<String> hashs = redisTemplate.opsForGeo().hash("home", "張三", "李四"); System.out.println(hash); System.out.println(hashs);

4.geopos : 獲取集合中任意元素的經緯度坐標,可以一次獲取多個

//注意:GeoHash對二維經緯度坐標進行一維映射是有損的,通過映射再還原回的經緯度坐標和原始輸入的經緯度坐標存在一定的誤差。 List<Point> position = redisTemplate.opsForGeo().position("home", "張三"); System.out.println(position); List<Point> positions = redisTemplate.opsForGeo().position("home", "張三", "李四"); System.out.println(positions);

5.GEORADIUS以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。

//通過經度,緯度查找附近的人 Circle circle = new Circle(116.48105, 39.996794, Metrics.KILOMETERS.getMultiplier()); RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(50); GeoResults<RedisGeoCommands.GeoLocation<Object>> byxy = redisTemplate.opsForGeo().radius("home", circle, args); System.out.println("通過經緯度附近的人:" + byxy);//通過地方查找附近5km的2個人 RedisGeoCommands.GeoRadiusCommandArgs args2 = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(2); GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.opsForGeo().radius("home", "張三", new Distance(5, Metrics.KILOMETERS),args2); System.out.println("通過名字附近的人:" + radius);

在給定以下可選項時, 命令會返回額外的信息: WITHDIST: 在返回位置元素的同時, 將位置元素與中心之間的距離也一并返回。 距離的單位和用戶給定的范圍單位保持一致。 WITHCOORD: 將位置元素的經度和維度也一并返回。 WITHHASH: 以 52 位有符號整數的形式, 返回位置元素經過原始 geohash 編碼的有序集合分值。 這個選項主要用于底層應用或者調試, 實際中的作用并不大。 命令默認返回未排序的位置元素。 通過以下兩個參數, 用戶可以指定被返回位置元素的排序方式: ASC: 根據中心的位置, 按照從近到遠的方式返回位置元素。 DESC: 根據中心的位置, 按照從遠到近的方式返回位置元素。 在默認情況下, GEORADIUS 命令會返回所有匹配的位置元素。 雖然用戶可以使用 COUNT <count> 選項去獲取前 N 個匹配元素, 但是因為命令在內部可能會需要對所有被匹配的元素進行處理, 所以在對一個非常大的區域進行搜索時, 即使只使用 COUNT 選項去獲取少量元素, 命令的執行速度也可能會非常慢。 但是從另一方面來說, 使用 COUNT 選項去減少需要返回的元素數量, 對于減少帶寬來說仍然是非常有用的。

6.GEORADIUSBYMEMBER這個命令和 GEORADIUS 命令一樣, 都可以找出位于指定范圍內的元素, 但是 GEORADIUSBYMEMBER 的中心點是由給定的位置元素決定的。

這個在spring里面方法已過時

詳細可以看文檔http://redisdoc.com/geo/index.html?

總結

以上是生活随笔為你收集整理的redis 的geo地理位置及实现附近的人的功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。