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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

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

前言

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

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

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

它只是一個(gè)普通的zset結(jié)構(gòu)。

1.geoadd?: 添加一個(gè)地理位置

//geoadd : (緯度、經(jīng)度、名稱)三元組 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 : 計(jì)算兩個(gè)元素之間的距離

//計(jì)算張三李四之間的距離 其中,距離單位可以是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 : 獲取元素經(jīng)緯度坐標(biāo)經(jīng)過(guò)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 : 獲取集合中任意元素的經(jīng)緯度坐標(biāo),可以一次獲取多個(gè)

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

5.GEORADIUS以給定的經(jīng)緯度為中心, 返回鍵包含的位置元素當(dāng)中, 與中心的距離不超過(guò)給定最大距離的所有位置元素。

//通過(guò)經(jīng)度,緯度查找附近的人 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("通過(guò)經(jīng)緯度附近的人:" + byxy);//通過(guò)地方查找附近5km的2個(gè)人 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("通過(guò)名字附近的人:" + radius);

在給定以下可選項(xiàng)時(shí), 命令會(huì)返回額外的信息: WITHDIST: 在返回位置元素的同時(shí), 將位置元素與中心之間的距離也一并返回。 距離的單位和用戶給定的范圍單位保持一致。 WITHCOORD: 將位置元素的經(jīng)度和維度也一并返回。 WITHHASH: 以 52 位有符號(hào)整數(shù)的形式, 返回位置元素經(jīng)過(guò)原始 geohash 編碼的有序集合分值。 這個(gè)選項(xiàng)主要用于底層應(yīng)用或者調(diào)試, 實(shí)際中的作用并不大。 命令默認(rèn)返回未排序的位置元素。 通過(guò)以下兩個(gè)參數(shù), 用戶可以指定被返回位置元素的排序方式: ASC: 根據(jù)中心的位置, 按照從近到遠(yuǎn)的方式返回位置元素。 DESC: 根據(jù)中心的位置, 按照從遠(yuǎn)到近的方式返回位置元素。 在默認(rèn)情況下, GEORADIUS 命令會(huì)返回所有匹配的位置元素。 雖然用戶可以使用 COUNT <count> 選項(xiàng)去獲取前 N 個(gè)匹配元素, 但是因?yàn)槊钤趦?nèi)部可能會(huì)需要對(duì)所有被匹配的元素進(jìn)行處理, 所以在對(duì)一個(gè)非常大的區(qū)域進(jìn)行搜索時(shí), 即使只使用 COUNT 選項(xiàng)去獲取少量元素, 命令的執(zhí)行速度也可能會(huì)非常慢。 但是從另一方面來(lái)說(shuō), 使用 COUNT 選項(xiàng)去減少需要返回的元素?cái)?shù)量, 對(duì)于減少帶寬來(lái)說(shuō)仍然是非常有用的。

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

這個(gè)在spring里面方法已過(guò)時(shí)

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。