redis 的geo地理位置及实现附近的人的功能
前言
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)題。
- 上一篇: oracle utl_file fcop
- 下一篇: php ckfinder 无效请求.,解