redis在3.2版本里面新增的一个功能就是对GEO(地理位置)的支持。
理位置大概提供了6个命令,分别为:
它只是一个普通的zset结构。
//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), "王五");
//计算张三李四之间的距离 其中,距离单位可以是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());
List hash = redisTemplate.opsForGeo().hash("home", "张三");
List hashs = redisTemplate.opsForGeo().hash("home", "张三", "李四");
System.out.println(hash);
System.out.println(hashs);
//注意:GeoHash对二维经纬度坐标进行一维映射是有损的,通过映射再还原回的经纬度坐标和原始输入的经纬度坐标存在一定的误差。
List position = redisTemplate.opsForGeo().position("home", "张三");
System.out.println(position);
List positions = redisTemplate.opsForGeo().position("home", "张三", "李四");
System.out.println(positions);
//通过经度,纬度查找附近的人
Circle circle = new Circle(116.48105, 39.996794, Metrics.KILOMETERS.getMultiplier());
RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(50);
GeoResults> 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> radius = redisTemplate.opsForGeo().radius("home", "张三", new Distance(5, Metrics.KILOMETERS),args2);
System.out.println("通过名字附近的人:" + radius);
在给定以下可选项时, 命令会返回额外的信息: WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。 WITHCOORD: 将位置元素的经度和维度也一并返回。 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。 命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式: ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。 DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。 在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT
这个在spring里面方法已过时
详细可以看文档http://redisdoc.com/geo/index.html