中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中利用redis實現一個LBS服務

發布時間:2021-07-24 15:18:11 來源:億速云 閱讀:222 作者:Leah 欄目:編程語言

這篇文章給大家介紹Java中利用redis實現一個LBS服務,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

GEOADD 和 GEORADIOUS

命令描述

GEOADD

GEOADD key longitude latitude member [longitude latitude member ...]

這個命令將指定的地理空間位置(緯度、經度、名稱)添加到指定的 key 中。

有效的經度從-180度到180度。

有效的緯度從-85.05112878度到85.05112878度。

當坐標位置超出上述指定范圍時,該命令將會返回一個錯誤。

該命令可以一次添加多個地理位置點

GEORADIOUS

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

這個命令以給定的經緯度為中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。范圍可以使用以下其中一個單位:

m 表示單位為米。  km 表示單位為千米。  mi 表示單位為英里。  ft 表示單位為英尺。

在給定以下可選項時, 命令會返回額外的信息:

WITHDIST: 在返回位置元素的同時, 將位置元素與中心之間的距離也一并返回。 距離的單位和用戶給定的范圍單位保持一致。  WITHCOORD: 將位置元素的經度和維度也一并返回。  WITHHASH: 以 52 位有符號整數的形式, 返回位置元素經過原始 geohash 編碼的有序集合分值。 這個選項主要用于底層應用或者調試, 實際中的作用并不大。  ASC: 根據中心的位置, 按照從近到遠的方式返回位置元素。  DESC: 根據中心的位置, 按照從遠到近的方式返回位置元素。  在默認情況下, GEORADIUS 命令會返回所有匹配的位置元素。 雖然用戶可以使用 COUNT <count> 選項去獲取前 N 個匹配元素

接口定義

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 {/*** 存儲一個位置** @param postion 增加的位置對象* @throws Exception*/boolean addPostion(Postion postion);/*** 查詢以指定的坐標為中心,指定的距離為半徑的范圍類的所有位置點** @param center 中心點位置* @param distinct 最遠距離,單位米* @param asc 是否倒序排序* @return 有效的位置*/List<Postion> radious(String type, GeoCoordinate center, Long distinct, Boolean asc);}

實現的接口

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<Postion> radious(String type, GeoCoordinate center, Long distinct, Boolean asc) {List<Postion> postions = new ArrayList<Postion>();Jedis jedis = redisConnection.getJedis();try {GeoRadiusParam geoRadiusParam = GeoRadiusParam.geoRadiusParam().withCoord().withDist();if (asc) {geoRadiusParam.sortAscending();} else {geoRadiusParam.sortDescending();}List<GeoRadiusResponse> responses = jedis.georadius(type,center.getLongitude(),center.getLatitude(),distinct.doubleValue(),GeoUnit.M,geoRadiusParam);if (responses != null) {for (GeoRadiusResponse response : responses) {Postion postion = new Postion(response.getMemberByString(),type,response.getCoordinate().getLongitude(),response.getCoordinate().getLatitude());postion.setDistinct(response.getDistance());postions.add(postion);}}} finally {if (jedis != null) {jedis.close();}}return postions;}}

測試用例

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服務測試類** @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<Postion> postions = lbsServiceRedis.radious(type, center, 1000 * 10L, true);Assert.assertTrue(postions.size() == 2 && exist(postions, "2017122802") && exist(postions, "2017122803"));}@Testpublic void test50KMRadious() {List<Postion> postions = lbsServiceRedis.radious(type, center, 1000 * 50L, true);Assert.assertTrue(postions.size() == 4&& exist(postions, "2017122802")&& exist(postions, "2017122803")&& exist(postions, "2017122806")&& exist(postions, "2017122804"));}private boolean exist(List<Postion> postions, String key) {if (postions != null) {for (Postion postion : postions) {if (postion.getId().equals(key)) {return true;}}}return false;}@Beforepublic void after() {RedisConnection redisConnection = RedisConnectionUtil.create();cacheService = new CacheServiceRedisImpl();cacheService.setDbIndex(15);cacheService.setRedisConnection(redisConnection);cacheService.delObject(type);}}

關于Java中利用redis實現一個LBS服務就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文登市| 华亭县| 吉水县| 绥宁县| 池州市| 罗平县| 康保县| 涟源市| 比如县| 高阳县| 宁安市| 江口县| 甘谷县| 西贡区| 临西县| 芜湖市| 乌拉特前旗| 濮阳市| 聊城市| 湖口县| 常熟市| 洪泽县| 榆社县| 沁源县| 大渡口区| 景宁| 九寨沟县| 德昌县| 诸暨市| 容城县| 九龙县| 聊城市| 石家庄市| 定日县| 松江区| 盐池县| 明溪县| 秀山| 神池县| 兰溪市| 保康县|