前言
redis在3.2版本里面新增的一个功能就是对GEO(地理位置)的支持。
理位置大概提供了6个命令,分别为:
- GEOADD
- GEODIST
- GEOHASH
- GEOPOS
- GEORADIUS
- GEORADIUSBYMEMBER
它只是一个普通的zset结构。
1.geoadd : 添加一个地理位置
//geoadd : (纬度、经度、名称)三元组
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 : 获取元素经纬度坐标经过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 : 获取集合中任意元素的经纬度坐标,可以一次获取多个
//注意:GeoHash对二维经纬度坐标进行一维映射是有损的,通过映射再还原回的经纬度坐标和原始输入的经纬度坐标存在一定的误差。
List<Point> position = redisTemplate.opsForGeo().position("home", "张三");
System.out.println(position);
List<Point> positions = redisTemplate.opsForGeo().position("home", "张三", "李四");
System.out.println(positions);
5.GEORADIUS以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
//通过经度,纬度查找附近的人
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("通过经纬度附近的人:" + 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: 将位置元素的经度和维度也一并返回。 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。 命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式: ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。 DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。 在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT <count> 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。
6.GEORADIUSBYMEMBER这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的。
这个在spring里面方法已过时