redis 的geo地理位置及实现附近的人的功能
前言
redis在3.2版本里面新增的一個功能就是對GEO(地理位置)的支持。
理位置大概提供了6個命令,分別為:
- GEOADD
- GEODIST
- GEOHASH
- GEOPOS
- GEORADIUS
- GEORADIUSBYMEMBER
它只是一個普通的zset結(jié)構(gòu)。
1.geoadd?: 添加一個地理位置
//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 : 計算兩個元素之間的距離
//計算張三李四之間的距離 其中,距離單位可以是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)過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),可以一次獲取多個
//注意:GeoHash對二維經(jīng)緯度坐標(biāo)進(jìn)行一維映射是有損的,通過映射再還原回的經(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)中, 與中心的距離不超過給定最大距離的所有位置元素。
//通過經(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("通過經(jīng)緯度附近的人:" + 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: 將位置元素的經(jīng)度和維度也一并返回。 WITHHASH: 以 52 位有符號整數(shù)的形式, 返回位置元素經(jīng)過原始 geohash 編碼的有序集合分值。 這個選項主要用于底層應(yīng)用或者調(diào)試, 實際中的作用并不大。 命令默認(rèn)返回未排序的位置元素。 通過以下兩個參數(shù), 用戶可以指定被返回位置元素的排序方式: ASC: 根據(jù)中心的位置, 按照從近到遠(yuǎn)的方式返回位置元素。 DESC: 根據(jù)中心的位置, 按照從遠(yuǎn)到近的方式返回位置元素。 在默認(rèn)情況下, GEORADIUS 命令會返回所有匹配的位置元素。 雖然用戶可以使用 COUNT <count> 選項去獲取前 N 個匹配元素, 但是因為命令在內(nèi)部可能會需要對所有被匹配的元素進(jìn)行處理, 所以在對一個非常大的區(qū)域進(jìn)行搜索時, 即使只使用 COUNT 選項去獲取少量元素, 命令的執(zhí)行速度也可能會非常慢。 但是從另一方面來說, 使用 COUNT 選項去減少需要返回的元素數(shù)量, 對于減少帶寬來說仍然是非常有用的。
6.GEORADIUSBYMEMBER這個命令和 GEORADIUS 命令一樣, 都可以找出位于指定范圍內(nèi)的元素, 但是 GEORADIUSBYMEMBER 的中心點是由給定的位置元素決定的。
這個在spring里面方法已過時
詳細(xì)可以看文檔http://redisdoc.com/geo/index.html?
總結(jié)
以上是生活随笔為你收集整理的redis 的geo地理位置及实现附近的人的功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle utl_file fcop
- 下一篇: 苹果ppt_如何选择一款趁手的PPT软件