一、依赖引入

        <!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--redis连接依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

二、工具类代码

@Component
@Slf4j
public class RedisUtil {@Value("${spring.redis.geo.key}")private String GEO_REDIS_KEY;@Resourceprivate RedisTemplate<String, Object> redisTemplate;/*** 指定缓存失效时间*/public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {log.error("set expire time error.key:{}.", key, e);return false;}}/*** 根据key 获取过期时间*/public long getExpire(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}/*** 判断key是否存在*/public boolean hasKey(String key) {try {return redisTemplate.hasKey(key);} catch (Exception e) {log.error("redis hasKey method error.key:{}.", key, e);return false;}}/*** 删除缓存*/public void del(String... key) {if (key != null && key.length > 0) {if (key.length == 1) {redisTemplate.delete(key[0]);} else {redisTemplate.delete(Arrays.asList(key));}}}//------------------------------------GEO----------------------------------------/*** 增加用户位置*/public Long addGeoLocation(String username, double x, double y) {try {RedisGeoCommands.GeoLocation geoLocation = new RedisGeoCommands.GeoLocation(username, new Point(x, y));return redisTemplate.opsForGeo().add(GEO_REDIS_KEY, geoLocation);} catch (Exception exception) {throw new RuntimeException("addGeoLocation error.", exception);}}/*** 删除用户位置,GEO实际上放在ZSET结构的数据,因此可用ZREM删除*/public Long deleteGeoLocation(String username) {try {return redisTemplate.opsForZSet().remove(GEO_REDIS_KEY, username);} catch (Exception exception) {throw new RuntimeException("deleteGeoLocation error.", exception);}}/*** 获取用户位置*/public List<Point> getGeoLocation(String username) {try {return redisTemplate.opsForGeo().position(GEO_REDIS_KEY, username);} catch (Exception e) {throw new RuntimeException("getGetLocation error.", e);}}/*** 计算用户相隔距离*/public Distance getDistance(String usernameOne, String usernameTwo, RedisGeoCommands.DistanceUnit unit) {try {return redisTemplate.opsForGeo().distance(GEO_REDIS_KEY, usernameOne, usernameTwo,unit);} catch (Exception e) {throw new RuntimeException("getDistance error.", e);}}/*** 获取某个用户 附近 n个距离单位m 内的附近z个用户*/public GeoResults<RedisGeoCommands.GeoLocation<Object>> getRadius(String username, int radius, RedisGeoCommands.DistanceUnit unit, int limit) {try {Distance distance = new Distance(radius, unit);RedisGeoCommands.GeoRadiusCommandArgs args =RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(limit);return redisTemplate.opsForGeo().radius(GEO_REDIS_KEY, username, distance, args);} catch (Exception e) {throw new RuntimeException("getDistance error.", e);}}
}

三、使用样例

添加Redis相关yml配置。

# redis配置,以下有默认配置的也可以使用默认配置
spring:redis:host: 127.0.0.1port: 6379password: 123456    # 如果无密码,直接注释掉即可timeout: 1000pool:minIdle: 5maxIdle: 10maxWait: -1maxActive: 20geo:key: spring_homeworkapplication:name: position-provider

工具类相关Bean。

// ----------------------UserPosition------------------------------
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserPosition implements Serializable {private String username;    // 用户名private double longitude;   // 经度private double latitude;    // 纬度
}// -----------------------UserNearby-----------------------------
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.geo.Distance;import java.io.Serializable;@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserNearby implements Serializable {private Distance distance;private UserPosition position;
}

Service层使用RedisUtil。

@Slf4j
public class PositionServiceImpl implements PositionService {@Autowiredprivate RedisUtil redisUtil;@Overridepublic List<UserPosition> getGeoLocation(String username) {log.info("username:{} delete geoLocation.",username);List<Point> points = redisUtil.getGeoLocation(username);List<UserPosition> positions = new ArrayList<>();for (Point point : points) {if (Objects.nonNull(point)) {positions.add(new UserPosition(username,point.getX(),point.getY()));}}return positions;}@Overridepublic Long addGeoLocation(String username, double x, double y) {return redisUtil.addGeoLocation(username, x, y);}@Overridepublic Long deleteGeoLocation(String username) {log.info("username:{} delete geoLocation.",username);return redisUtil.deleteGeoLocation(username);}@Overridepublic Distance getDistance(String usernameOne, String usernameTwo, RedisGeoCommands.DistanceUnit unit) {return redisUtil.getDistance(usernameOne, usernameTwo, unit);}@Overridepublic List<UserNearby> getRadius(String username, int radius, RedisGeoCommands.DistanceUnit unit, int limit) {GeoResults<RedisGeoCommands.GeoLocation<Object>> result = redisUtil.getRadius(username, radius, unit, limit);List<UserNearby> userNearbyList = new ArrayList<>();result.getContent().forEach((one) -> {userNearbyList.add(new UserNearby(one.getDistance(), new UserPosition((String) one.getContent().getName(),one.getContent().getPoint().getX(),one.getContent().getPoint().getY())));});return userNearbyList;}
}

Redis —— SpringBoot工程下的GeoHash工具类相关推荐

  1. Springboot工程下使用mybatis反向工程

    Springboot工程下使用mybatis逆向工程 1.引言 mybatis是目前很流行的持久层框架,其逆向工程更是大大缩减了我们的开发时间.所谓mybatis逆向工程,就是mybatis会根据我们 ...

  2. Apache下的ArrayUtils工具类总结

    Apache下的ArrayUtils工具类总结 ArrayUtils中的方法: 1.add():将给定的数据添加到指定的数组中,返回一个新的数组. 2.addAll():合并两个数组. 3.conta ...

  3. 多线程十 JUC包下的常用工具类

    JUC包下的常用工具类 1. CountDownLatch-闭锁 2. CyclicBarrier-循环栅栏 3. Semaphore-信号量 4. Exchanger-线程数据交换器 这篇文章主要是 ...

  4. SpringBoot实战:整合Redis、mybatis,封装RedisUtils工具类等(附源码)

    创建SpringBoot项目 在线创建方式 网址:https://start.spring.io/ 然后创建Controller.Mapper.Service包 SpringBoot整合Redis 引 ...

  5. SpringBoot实战:整合Redis、mybatis,封装RedisUtils工具类等

    创建SpringBoot项目 在线创建方式 网址:https://start.spring.io/ 然后创建Controller.Mapper.Service包 SpringBoot整合Redis 引 ...

  6. Spring Boot实战:整合Redis、MyBatis,封装RedisUtils工具类

    创建 Spring Boot 项目 在线创建方式 网址:https://start.spring.io/ 然后创建Controller.Mapper.Service包 SpringBoot整合Redi ...

  7. 这些SpringBoot天生自带Buff工具类你都用过哪些?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/7043403364020781064 断言 断言是一个逻辑判断,用于检查不应该 ...

  8. Springboot+axios+vue使用VerifyCodeUtils工具类实现验证码图片功能

    一.环境准备 idea java 1.8 maven 3.6.3 操作系统:window10 vue.min.js axios.min.js 二.VerifyCodeUtils工具类 import j ...

  9. 【redis系列】redisTemplate缓存常用工具类

    背景 日常开发过程中,大家使用redis缓存基本上是家常便饭,但是代码中使用redisTemplate组件会略显得麻烦,使用时需要开发人员查阅官网文档,具体场景使用哪些方法,会花费相对的时间,故小编为 ...

最新文章

  1. 清除window 系统中的垃圾文件-转
  2. 禁用删除键退回历史记录_如何在Windows 8中删除或禁用搜索超级按钮历史记录
  3. python对文件的写操作方法writetext_用python实现读写文件常见操作方式
  4. Json学习总结(8)——经过多方调研,最终还是决定禁用FastJson
  5. 什么叫做数字功放?它的电路原理是什么?
  6. 步进电机只能一个方向转?
  7. 解决float型数据精度损失问题
  8. about command : wget
  9. node.js 实现udp传输_nodejs实现UDP组播示例方法
  10. linux grep 日期,linux 文本处理工具之一grep命令详解
  11. DIN 轴承标准目录
  12. 【Linux集群教程】11 集群监控 - Zabbix 搭建
  13. 浅谈essay、paper和dissertation的区别
  14. c语言easyx背景图片,C++之设置背景图片(Easyx)
  15. 【视频】海康摄像头、NVR网络协议简介
  16. java数组交换位置_Java数组元素位置交换?
  17. 第三部分:成交动力学之成交激素(二)——2、独特
  18. pytorch中使用TensorBoard进行可视化Loss及特征图
  19. 用python画苹果的代码_使用python画个小猪佩奇的示例代码
  20. 用python画竹子_竹蜻蜓Basic简易入门

热门文章

  1. 笔记本高分屏字体模糊_4k/1080p屏幕字体模糊怎么办?win10高分屏笔记本字体模糊太小的解决办法...
  2. unordered_map详细介绍
  3. AMD的双向田忌赛马:7nm中端CPU挑落顶级i9,旗舰GPU只对位NV三当家 | CES 2019
  4. 【网络工程师】<软考中级>网络互联与互联网
  5. 晶圆测试Map转换(TSK/TEL/PT301)
  6. 艺赛旗(RPA) Pandas 类库基础知识
  7. JAVA之父----James Gosling(詹姆斯·高斯林)
  8. 百万富翁问题--安全多方计算
  9. 结合stata和pyecharts对双11淘宝销量数据分析(进度5%,咯咯咯 我鸽了)
  10. 云边端一体化技术白皮书