标签:接受 family 自己 关于 ops 必须 概念 long metrics
一般常用的地方:
当我们的做需求的时候会有这样的需求,如当我们需要做位置定位,或者我们需要知道当前所在位置坐标(经度,维度,位置名字),或者去寻找多少米内的建筑位置 或者是建筑个数,这个我们可以利用redis的GEO地理定位计算可以得出,数据库中存放商家的经纬度(坐标),通过geo计算得出距离。
关于 Redis Geo介绍
GEOADD
命令以标准的 x,y
格式接受参数 ,所以用户必须先输入经度, 然后再输入纬度。 GEOADD
能够记录的坐标是有限的: 非常接近两极的区域是无法被索引的。
有效的经度介于 -180 度至 180 度之间。
有效的纬度介于 -85.05112878 度至 85.05112878 度之间。
当用户尝试输入一个超出范围的经度或者纬度时, GEOADD
命令将返回一个错误。
/*** * 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。 * @param key redis的key * @param precision 经度 * @param dimension 纬度 * @param name 名称 * @return */ name可根据自己需求变更为相应的类型 public Long redisGeoAdd(String key, double precision, double dimension, String name) { Long addedNum = redisTemplate.opsForGeo().add(key, new Point(precision, dimension), name); //params: key, Point(经度, 纬度), 地方名称 return addedNum; }
GEOPOS
命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。
/*** * 从key里返回所有给定位置元素的位置(经度和纬度)。 * @param key redis的key * @param nameList 名称的集合 */ public List redisGeoGet(String key, String nameList) { List points = redisTemplate.opsForGeo().geoPos(key, nameList);//params: key, 地方名称... //List points = redisTemplate.opsForGeo().position(key, nameList);//params: key, 地方名称... return points; }
GEODIST
命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。 返回两个给定位置之间的距离
/*** * 返回两个给定位置之间的距离。 * @param key redis的key * @param name1 地方名称1 * @param name2 地方名称2 * @return */ public Distance geoDist(String key, String name1, String name2) { Distance distance = redisTemplate.opsForGeo() .distance(key, name1, name2, RedisGeoCommands.DistanceUnit.KILOMETERS);
//params: key, 地方名称1, 地方名称2, 距离单位 return distance; }
REDISDIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT <count>
选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT
选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT
选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。
/*** * 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素,并给出所有位置元素与中心的平均距离。 * @param key redis的key * @param precision 经度 * @param dimension 纬度 * @param distance 距离 * @param count 人数 * @return */ public GeoResults<RedisGeoCommands.GeoLocation<String>> redisNearByXY(String key, double precision, double dimension, Integer distance, Integer count) { //Point(经度, 纬度) Distance(距离量, 距离单位) GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo().radius( key, new Circle(new Point(precision, dimension), new Distance(distance, Metrics.KILOMETERS)), RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(count)); return results; }
这个命令和 GEORADIUS(REDISDIUS)
命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER
的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS
那样, 使用输入的经度和纬度来决定中心点。
/** * * @param key KEY * @param precision 地区名 * @param distance 距离 * @return true */ public GeoResults redisGeoMember(String key,String precision, Integer distance){ GeoResults geoResults = redisTemplate.opsForGeo().geoRadiusByMember(key, precision, distance); return geoResults; }
返回一个或多个位置元素的 GEOHASH 表示 命令返回的 GEOHASH 的位置与用户给定的位置元素的位置一一对应。
/*** * 返回一个或多个位置元素的 Geohash 表示 * @param key redis的key * @param nameList 名称的集合 */ public List<String> geoHash(String key, String nameList) { //params: key, 地方名称... List<String> results = redisTemplate.opsForGeo().hash(key, nameList); return results; }
标签:接受 family 自己 关于 ops 必须 概念 long metrics
原文地址:https://www.cnblogs.com/YLSF/p/14695548.html