当前位置: 首页 > news >正文

网站开发与服务器匹配腾讯云域名

网站开发与服务器匹配,腾讯云域名,天津模板网页制作报价,杭州营销型网站建设文章目录 前言Geo介绍Geo指令使用使用场景:附近的人参考文献 前言 Redis除了常见的五种数据类型之外,其实还有一些少见的数据结构,如Geo,HyperLogLog等。虽然它们少见,但是作用却不容小觑。本文将介绍Geo指令的语法和…

文章目录

      • 前言
      • Geo介绍
      • Geo指令使用
      • 使用场景:附近的人
      • 参考文献

前言

  • Redis除了常见的五种数据类型之外,其实还有一些少见的数据结构,如Geo,HyperLogLog等。虽然它们少见,但是作用却不容小觑。本文将介绍Geo指令的语法和使用场景。

Geo介绍

  • Geo是"geolocation"的缩写,即地理定位器,顾名思义就是记录地理位置信息,用来进行地址位置排序的数据结构。所以它场景的应用场景便是寻找附近的人最佳路线推荐等等。
  • 说到地址位置排序,不得不提地理位置距离排序算法GeoHash算法,Redis也使用了这个算法。简单来说,这个算法就是将某地点的经度和纬度进行编码之后,成为的一维整数,整数越接近,两个地点也就越接近。通过整数可以还原出经纬度坐标,整数越长,还原出来的坐标损失程度就越小。GeoHash算法会继续对这个整数做一次base32编码,使其变成字符串。
  • 于是在使用Geo数据结构时,可以简单地理解为,它只是一个zset,score是元素地址经过GeoHash算法得到的52位整数(在Redis里面,经纬度使用52位的整数进行编码),value存放该元素。

Geo指令使用

  • 向Geo中添加地理空间信息:geoadd key 经度 纬度 具体元素

    geoadd restaurant 95 20 "沙县小吃"    
    geoadd restaurant 96 19 "肯德基" 120 27 "麦当劳"
    
  • 返回指定两个元素的距离:geodist key 元素1 元素2 距离单位

    geodist restaurant "沙县小吃" "肯德基" km
    
  • 获取元素坐标:geopos key 元素1 … 元素n

    geopos restaurant "麦当劳"
    geopos restaurant "沙县小吃" "肯德基"
    
  • 获取指定元素坐标的hash字符串:geohash key 元素1

    geohash restaurant "沙县小吃"  
    

    获取到的hash值可以到 http://geohash.org/${hash} 上进行定位,得到经纬度坐标

    在这里插入图片描述

  • 指定圆心半径,找到该圆范围内的所有元素,并按与圆心距离排序后返回:georadius key 经度 纬度 半径 单位 withdist/withcoord/withhash count n des/asc

    georadius restaurant 95 21 100 km withdist count 3 asc # 查找经度95 纬度21的地点半径100公里以内的餐馆,正序输出三个餐馆
    

    withdist: 同时返回该元素与圆心的距离,距离单位为georadius指令指定的单位
    withhash: 同时返回52位整数编码后的字符串
    withcoord: 同时返回该元素的经纬度坐标

使用场景:附近的人

  • 需求:实现查看附近的人功能。

  • 实现方案:使用geo数据结构,将用户的位置经纬度保存在geo中,然后对这些信息进行查询。

  • 代码实现:代码中saveUserLocation()方法负责添加用户位置信息,在添加时使用outOfChina()方法判断做位置检验,是否用户位置在国内,不在国内就不保存了,deleteUserLocation()方法负责删除某用户的位置信息,getNearByLocation()方法负责查询某个地方附近的用户。

    public class NearbyPeopleDemo {public static void main(String[] args) {Jedis jedis = new Jedis("127.0.0.1");jedis.del(LOCATION_KEY);double lon ;double lat ;//向redis中存放用户的地址,随机生成一万个用户。for(int i = 0;i<10000;i++){lon = Math.random()*(138-72+1)+72;lat = Math.random()*(55-0+1);//判断该位置是否属于中国,不属于就不加了if(!outOfChina(lon,lat)) {saveUserLocation("用户"+i, lon, lat, jedis);}}System.out.println("添加用户位置信息完毕!");System.out.println("距离经度100,纬度35位置100km以内的人有哪些:"+getNearByLocation(100, 35, 100, jedis));}private static final String LOCATION_KEY = "location";/*** 保存用户位置信息* @param userId 用户id* @param longitude 经度* @param latitude 纬度* @param jedis*/public static void saveUserLocation(String userId, double longitude, double latitude, Jedis jedis){jedis.geoadd(LOCATION_KEY,longitude,latitude,userId);}/*** 根据用户id删除用户位置信息,采用zset的删除方式删除即可* @param userId* @param jedis*/public static void deleteUserLocation(String userId,Jedis jedis){jedis.zrem(LOCATION_KEY,userId);}/*** 查询附近的人* @param longitude 经度* @param latitude 纬度* @param radius 半径* @param jedis* @return*/public static List<String> getNearByLocation(double longitude, double latitude,double radius,Jedis jedis){List<GeoRadiusResponse> georadius = jedis.georadius(LOCATION_KEY, longitude, latitude, radius, GeoUnit.KM);return georadius.stream().map(GeoRadiusResponse::getMemberByString).collect(Collectors.toList());}/*** 判断经纬度是否超过了中国* @param longitude 经度* @param latitude 纬度* @return*/public static boolean outOfChina(double longitude,double latitude){if (longitude < 72.004 || longitude > 137.8347)return true;if (latitude < 0.8293 || latitude > 55.8271)return true;return false;}}
    
  • 测试结果:我们在main方法中,随机生成一万个用户位置信息,保存在redis中,之后调用getNearByLocation()方法查找距离经度100,纬度35的位置100km以内的人有哪些,运行结果如下:
    在这里插入图片描述

参考文献

  • 《91.Redis深度历险 核心原理与应用实践》–钱文品
http://www.hengruixuexiao.com/news/32708.html

相关文章:

  • table做网站的好处上海网站快速排名优化
  • 苏州网站建设最好培训课程开发
  • 网站开发php还是java对网站进行seo优化
  • 网站建设设计师的工作内容百度推广最近怎么了
  • .tv做网站怎么样2021年新闻摘抄
  • weex做的网站搜索量排名
  • 叫别人做网站要注意什么恢复原来的百度
  • 大连公司做网站seo长尾快速排名
  • 厂家做网站线上平台怎么推广
  • 做平台网站一般有php还是jsseo网站优化价格
  • 网络营销方案设计题seo值怎么提高
  • php做网站都需要学什么网页设计主题参考
  • 人力外包公司有哪些seo交流群
  • 做性事的视频网站名字宁波seo公司排名榜
  • 网站页面设计如何收费网络推广是诈骗吗
  • 微信上做任务让你注册彩票网站百度手机助手下载安装最新版
  • 跨境电商网站建设南京响应式网站建设
  • 长沙企业网站制作服务报价东莞做网站优化
  • 学做PPT报告的网站百度seo怎么做网站内容优化
  • 原子艺术做的网站怎么样子谷歌seo查询
  • 做放单主持的网站观看b站的广告网站平台
  • 百度的网站哪来的宁波seo网络推广代理公司
  • 毕业设计做的网站抄袭站长之家点击进入
  • 东莞建筑建设网站建设产品线上营销方案
  • 网站后台模板论坛今晚比分足球预测
  • 爱尚网站建设seo报名在线咨询
  • 大亚湾做网站公司seo关键词布局案例
  • 专业的网站设计制作网站优化关键词公司
  • 做PPT不错的网站有哪些青岛网页搜索排名提升
  • 做网站导航条怎么弄免费的自媒体一键发布平台