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地理位置及实现附近的人的功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle utl_file fcop
- 下一篇: php ckfinder 无效请求.,解