儿童定位手表,有个交友功能,查找附近的人,用redis的geo来实现比较简单,其实是一个ZSET(有序集合)

redis 版本要大于3.2

查看redis 版本    /usr/bin/redis-server      --version

注意引入的jar版本:可能运行时候会报错,这时要检查jar包的版本,可能版本冲突导致报错

  1. public class Coordinate {
  2.  
  3. //经度
  4. private double longitude;
  5.  
  6. //纬度
  7. private double latitude;
  8.  
  9. //用户id
  10. private String key;
  11.  
  12. public double getLatitude() {
  13. return latitude;
  14. }
  15. public void setLatitude(double latitude) {
  16. this.latitude = latitude;
  17. }
  18. public double getLongitude() {
  19. return longitude;
  20. }
  21. public void setLongitude(double longitude) {
  22. this.longitude = longitude;
  23. }
  24. public String getKey() {
  25. return key;
  26. }
  27. public void setKey(String key) {
  28. this.key = key;
  29. }
  30.  
  31. }
  1. public class RedisUtil {
  2.  
  3. private static JedisPool jedisPool = null;
  4. // Redis服务器IP
  5. private static String ADDR = "xx.xxx.xx.xx";
  6. // Redis的端口号
  7. private static int PORT = ;
  8. // 访问密码
  9. private static String AUTH = "xxxxxx";
  10.  
  11. /**
  12. * 初始化Redis连接池
  13. */
  14. static {
  15. try {
  16. JedisPoolConfig config = new JedisPoolConfig();
  17. // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
  18. config.setBlockWhenExhausted(true);
  19. // 设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
  20. config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");
  21. // 是否启用pool的jmx管理功能, 默认true
  22. config.setJmxEnabled(true);
  23. // 最大空闲连接数, 默认8个 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
  24. config.setMaxIdle();
  25. // 最大连接数, 默认8个
  26. config.setMaxTotal();
  27. // 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
  28. config.setMaxWaitMillis( * );
  29. // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
  30. config.setTestOnBorrow(true);
  31. jedisPool = new JedisPool(config, ADDR, PORT, , AUTH);
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. /**
  37. * 获取Jedis实例
  38. *
  39. * @return
  40. */
  41. public synchronized static Jedis getJedis() {
  42. try {
  43. if (jedisPool != null) {
  44. Jedis resource = jedisPool.getResource();
  45. return resource;
  46. } else {
  47. return null;
  48. }
  49. } catch (Exception e) {
  50. e.printStackTrace();
  51. return null;
  52. }
  53. }
  54.  
  55. /**
  56. * 释放jedis资源
  57. *
  58. * @param jedis
  59. */
  60. public static void close(final Jedis jedis) {
  61. if (jedis != null) {
  62. jedis.close();
  63. }
  64. }
  65.  
  66. public static void main(String[] args) {
  67. Jedis jedis = RedisUtil.getJedis();
  68.  
  69. // //添加经纬度
  70. // Coordinate coordinate=new Coordinate();
  71. // coordinate.setLatitude(31.244803); //维度
  72. // coordinate.setLongitude(121.483671); //经度
  73. // coordinate.setKey("zhangsan"); //可以作为用户表的id
  74. //
  75. //
  76. // //添加经纬度
  77. // Coordinate coordinate1=new Coordinate();
  78. // coordinate1.setLatitude(31.245321); //维度
  79. // coordinate1.setLongitude(121.485015); //经度
  80. // coordinate1.setKey("lisi"); //可以作为用户表的id
  81. //
  82. // //添加经纬度
  83. // Coordinate coordinate2=new Coordinate();
  84. // coordinate2.setLatitude(31.245456); //维度
  85. // coordinate2.setLongitude(121.485285); //经度
  86. // coordinate2.setKey("wangwu"); //可以作为用户表的id
  87. //
  88. // addReo(coordinate);
  89. // addReo(coordinate1);
  90. // addReo(coordinate2);
  91.  
  92. // Coordinate query = new Coordinate();
  93. // query.setLongitude(121.485285);
  94. // query.setLatitude(31.245456);
  95. //
  96. // List<GeoRadiusResponse> result = geoQuery(query);
  97. // for(GeoRadiusResponse res : result) {
  98. // System.out.println(res.getMemberByString());
  99. // }
  100.  
  101. RedisUtil.close(jedis);
  102.  
  103. }
  104.  
  105. /**
  106. * 添加坐标
  107. * key 经度 维度 距离
  108. * return m 表示单位为米*/
  109. public static Long addReo(Coordinate coordinate) {
  110. Jedis jedis = null;
  111. try {
  112. jedis = jedisPool.getResource();
  113. //第一个参数可以理解为表名
  114. return jedis.geoadd("test",coordinate.getLongitude(),coordinate.getLatitude(),coordinate.getKey());
  115. } catch (Exception e) {
  116. System.out.println(e.getMessage());
  117. } finally {
  118. if (null != jedis)
  119. jedis.close();
  120. }
  121. return null;
  122. }
  123. /**
  124. * 查询附近人
  125. * key 经度 维度 距离
  126. * return GeoRadiusResponse*/
  127. public static List<GeoRadiusResponse> geoQuery(Coordinate coordinate) {
  128. Jedis jedis = null;
  129. try {
  130. jedis = jedisPool.getResource();
  131. //200F GeoUnit.KM表示km
  132. return jedis.georadius("test",coordinate.getLongitude(),coordinate.getLatitude(),100F,GeoUnit.M, GeoRadiusParam.geoRadiusParam().withDist());
  133. } catch (Exception e) {
  134. System.out.println(e.getMessage());
  135. } finally {
  136. if (null != jedis)
  137. jedis.close();
  138. }
  139. return null;
  140. }
  141.  
  142. }

引用相关jar

转载自:https://blog.csdn.net/liaodehong/article/details/59104451

redis 查找附近的人的更多相关文章

  1. Redis(6)——GeoHash查找附近的人

    像微信 "附近的人",美团 "附近的餐厅",支付宝共享单车 "附近的车" 是怎么设计实现的呢? 一.使用数据库实现查找附近的人 我们都知道, ...

  2. Redis实战篇(四)基于GEO实现查找附近的人功能

    如果现在要开发一个功能: 要为一款交友App实现查找附近的人,并按距离进行排序. 让你来开发这个功能,你会如何实现? MySQL 不合适 你可能想到,把用户用户的经纬度坐标使用MySQL等关系数据库( ...

  3. 使用PHP实现查找附近的人

    https://zhuanlan.zhihu.com/p/31380780 LBS(基于位置的服务) 查找附近的人有个更大的专有名词叫做LBS(基于位置的服务),LBS是指是指通过电信移动运营商的无线 ...

  4. 源码编译Redis Desktop Manager | 懒人屋

    原文:源码编译Redis Desktop Manager | 懒人屋 源码编译Redis Desktop Manager  2.3k  字    10  分钟    2019-10-10 文章背景 本 ...

  5. redis 的使用,及如何使用redis维护数亿人的登录状态

    一.redis中几个常用的方法 redis的使用场景移步本文 select db redis 下默认有有16个表,0~15可以通过:select 2 或者 select 11这样的方式切换表 keys ...

  6. 【Redis数据库】再有人问你CAP理论是什么,就把这篇文章发给他

    CAP是Consistency(一致性),Availability(可用性),Partition tolerance(分区容错性)的缩写.在学习redis过程中看到这个名词,查找各位大佬的文章发现这篇 ...

  7. redis查找大key

    redis中查找出比较大的key 下面直接上代码 (请在测试机上测试) #!/usr/bin/env python import sys import redis def check_big_key( ...

  8. 终极二分查找--传说十个人写九个有bug

    之前写过一篇极为罗嗦的二分查找,非常得意地以为以后就可以避免踩坑了,但是今天才知道二分查找可以写的既简洁又鲁棒,唉!还是要多学习啊! 给一个按照从大到小的顺序排序好的数组a[]={1,2,3,4,7, ...

  9. IntelliJ IDEA - 查找代码提交人

    转载. https://blog.csdn.net/abcyyjjkk/article/details/88995503 如果Annocation不可用

随机推荐

  1. $_POST和$GLOBALS['HTTP_RAW_POST_DATA'] 的区别

    HTTP 协议是建立在 TCP/IP 协议之上的应用层规范,它把 HTTP 请求分为三个部分:请求行.请求头.消息主体.协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协 ...

  2. 23.QT记事本

    描述 主要功能有: 新建,打开,保存,另存为,打印, 编辑,撤销,,拖放,xml配置文件读写,字体更改,查找替换 菜单栏,工具栏,状态栏的实现 如下图所示: 效果如下所示:   源码下载地址: htt ...

  3. Java多线程之内存可见性

    阅读本文约“3分钟” 共享变量在线程间的可见性 synchronized实现可见性 volatile实现可见性 —指令重排序 —as-if-serial语义 —volatile使用注意事项 synch ...

  4. 【转】AtomicReference与volatile的区别

    来源:AtomicReference与volatile的区别 AtomicReference与volatile的在可见性上的意义是一致的. volatile不能保证原子性,AutomicReferen ...

  5. 并发之AQS

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  6. python之匿名函数以及在内置函数中的使用

    一. 匿名函数 Python使用 lambda 来创建匿名函数.所谓匿名函数,它与用 def 关键字定义的函数相比,没有函数名称. 1.1 匿名函数定义及特点 语法: lambda [para1, p ...

  7. angular raido checkbox select取值

    radio {{modelName}} <div class="radio disIB"> <label class="i-checks"&g ...

  8. es6 语法 (map、set和obj 的对比)

    //数据结构对比 增查改删 { //map.set和Object let item = {t:1}; let map = new Map(); let set = new Set(); let obj ...

  9. 在centos7上编译安装nginx

    题前,先放一个有图有真相的博客链接:https://www.cnblogs.com/zhang-shijie/p/5294162.html 虽然别人说的很详细,但还是记录一下 1.VMWare Wor ...

  10. 17.Odoo产品分析 (二) – 商业板块(10) – 电子商务(1)

    查看Odoo产品分析系列--目录 安装电子商务模块 1. 主页 点击"商店"菜单:  2. 添加商品 在odoo中,你不用进入"销售"模块,再进入产品列表添加产 ...