這篇文章給大家介紹Java中利用redis實(shí)現(xiàn)一個(gè)LBS服務(wù),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、華容網(wǎng)站維護(hù)、網(wǎng)站推廣。
GEOADD 和 GEORADIOUS
命令描述
GEOADD
GEOADD key longitude latitude member [longitude latitude member ...]
這個(gè)命令將指定的地理空間位置(緯度、經(jīng)度、名稱)添加到指定的 key 中。
有效的經(jīng)度從-180度到180度。
有效的緯度從-85.05112878度到85.05112878度。
當(dāng)坐標(biāo)位置超出上述指定范圍時(shí),該命令將會(huì)返回一個(gè)錯(cuò)誤。
該命令可以一次添加多個(gè)地理位置點(diǎn)
GEORADIOUS
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
這個(gè)命令以給定的經(jīng)緯度為中心, 返回鍵包含的位置元素當(dāng)中, 與中心的距離不超過(guò)給定最大距離的所有位置元素。范圍可以使用以下其中一個(gè)單位:
m 表示單位為米。 km 表示單位為千米。 mi 表示單位為英里。 ft 表示單位為英尺。
在給定以下可選項(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í)際中的作用并不大。 ASC: 根據(jù)中心的位置, 按照從近到遠(yuǎn)的方式返回位置元素。 DESC: 根據(jù)中心的位置, 按照從遠(yuǎn)到近的方式返回位置元素。 在默認(rèn)情況下, GEORADIUS 命令會(huì)返回所有匹配的位置元素。 雖然用戶可以使用 COUNT
接口定義
package com.x9710.common.redis;import com.x9710.common.redis.domain.GeoCoordinate;import com.x9710.common.redis.domain.Postion;import java.util.List;public interface LBSService {/*** 存儲(chǔ)一個(gè)位置** @param postion 增加的位置對(duì)象* @throws Exception*/boolean addPostion(Postion postion);/*** 查詢以指定的坐標(biāo)為中心,指定的距離為半徑的范圍類的所有位置點(diǎn)** @param center 中心點(diǎn)位置* @param distinct 最遠(yuǎn)距離,單位米* @param asc 是否倒序排序* @return 有效的位置*/List
實(shí)現(xiàn)的接口
package com.x9710.common.redis.impl;import com.x9710.common.redis.LBSService;import com.x9710.common.redis.RedisConnection;import com.x9710.common.redis.domain.GeoCoordinate;import com.x9710.common.redis.domain.Postion;import redis.clients.jedis.GeoRadiusResponse;import redis.clients.jedis.GeoUnit;import redis.clients.jedis.Jedis;import redis.clients.jedis.params.geo.GeoRadiusParam;import java.util.ArrayList;import java.util.List;public class LBSServiceRedisImpl implements LBSService {private RedisConnection redisConnection;private Integer dbIndex;public void setRedisConnection(RedisConnection redisConnection) {this.redisConnection = redisConnection;}public void setDbIndex(Integer dbIndex) {this.dbIndex = dbIndex;}public boolean addPostion(Postion postion) {Jedis jedis = redisConnection.getJedis();try {return (1L == jedis.geoadd(postion.getType(),postion.getCoordinate().getLongitude(),postion.getCoordinate().getLatitude(),postion.getId()));} finally {if (jedis != null) {jedis.close();}}}public List
測(cè)試用例
package com.x9710.common.redis.test;import com.x9710.common.redis.RedisConnection;import com.x9710.common.redis.domain.GeoCoordinate;import com.x9710.common.redis.domain.Postion;import com.x9710.common.redis.impl.CacheServiceRedisImpl;import com.x9710.common.redis.impl.LBSServiceRedisImpl;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import java.util.List;/*** LBS服務(wù)測(cè)試類** @author 楊高超* @since 2017-12-28*/public class RedisLBSTest {private CacheServiceRedisImpl cacheService;private LBSServiceRedisImpl lbsServiceRedis;private String type = "SHOP";private GeoCoordinate center;@Beforepublic void before() {RedisConnection redisConnection = RedisConnectionUtil.create();lbsServiceRedis = new LBSServiceRedisImpl();lbsServiceRedis.setDbIndex(15);lbsServiceRedis.setRedisConnection(redisConnection);Postion postion = new Postion("2017122801", type, 91.118970, 29.654210);lbsServiceRedis.addPostion(postion);postion = new Postion("2017122802", type, 116.373472, 39.972528);lbsServiceRedis.addPostion(postion);postion = new Postion("2017122803", type, 116.344820, 39.948420);lbsServiceRedis.addPostion(postion);postion = new Postion("2017122804", type, 116.637920, 39.905460);lbsServiceRedis.addPostion(postion);postion = new Postion("2017122805", type, 118.514590, 37.448150);lbsServiceRedis.addPostion(postion);postion = new Postion("2017122806", type, 116.374766, 40.109508);lbsServiceRedis.addPostion(postion);center = new GeoCoordinate();center.setLongitude(116.373472);center.setLatitude(39.972528);}@Testpublic void test10KMRadious() {List
關(guān)于Java中利用redis實(shí)現(xiàn)一個(gè)LBS服務(wù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。