【Redis】之Geo

news2024/11/13 10:07:45

概述

Geo就是Geolocation的简写形式,代表地理坐标。在Redis中,构造了能够存储地址坐标信息的一种数据结构,帮助我们根据经纬度来检索数据。

命令行操作方法

GEOADD

可以用来添加一个或者多个地理坐标。

GEODIST

返回一个key中两个成员之间的距离。

GEOHASH

将指定member的坐标转为哈希字符串形式返回。

GEOPOS

返回指定member的坐标。

 GEORADIUS

指定圆心、半径,找到该圆内包含的member。

 GEOSEARCH

在指定范围内搜索member。最新的一个命令,可以指定中心点的经纬度,也可以使用member;并且还可以指定搜索范围是圆形还是正方形。

 StringRedisTemplate操作方法

add

用于添加地理坐标。

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void test(){
        Point point = new Point(112.653652,37.809874);
        Long add = this.stringRedisTemplate.opsForGeo().add("ShanXi", point, "SXU");
        System.out.println(add);
    }

 radius

用来查找坐标

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Test void test() {
        // 中心点
        Point point = new Point(112.617734,37.797128);
        // 半径
        Distance radius = new Distance(100, RedisGeoCommands.DistanceUnit.KILOMETERS);
        // 由中心点和半径组成的圆圈
        Circle circle = new Circle(point, radius);
        // 获取值之后要带回来的参数
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs()
                .includeDistance() // 包含距离
                .includeCoordinates() // 包含坐标
                .sortAscending(); // 升序
        // 进行查询
        GeoResults<RedisGeoCommands.GeoLocation<String>> search =
                this.stringRedisTemplate.opsForGeo().radius("ShanXi", circle, args);
        List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = search.getContent();
        if(content == null || content.isEmpty()) {
            System.out.println("没有数据");
        }
        for (GeoResult<RedisGeoCommands.GeoLocation<String>> geoLocationGeoResult : content) {
            // 输出距离
            System.out.println("距离:" + geoLocationGeoResult.getDistance());
            RedisGeoCommands.GeoLocation<String> locationGeoResultContent = geoLocationGeoResult.getContent();
            // 输出名称
            System.out.println("member:" + locationGeoResultContent.getName());
            // 输出坐标
            System.out.println("坐标" + locationGeoResultContent.getPoint());
        }
    }

search

和radius方法类似,只不过search还可以查找矩形范围之内的坐标。

remove

删除操作

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Test void test() {

        Long remove = this.stringRedisTemplate.opsForGeo().remove("ShanXi", "TaiYuanXueYuan");
        System.out.println(remove);

    }

 distance

查看两个地理位置之间的直线距离

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Test void test() {

        Distance distance = this.stringRedisTemplate.opsForGeo()
                .distance("ShanXi", "SXU", "ZonBei");
        System.out.println(distance);

    }

代码示例

需求:山西所有高校建立之后,都会把自己的位置上传到某信息平台,并且还会查询距离自己学校30公里之内的其他学校。当学校换位置之后,就会删除当前信息。

基础配置

@RestController
@RequestMapping("/school")
public class SchoolController {

    @Resource
    private SchoolService schoolService;

}
@Service
public class SchoolService extends ServiceImpl<SchoolMapper, School> {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

}
public interface SchoolMapper extends BaseMapper<School> {
}
@Data
public class School {

    // 学校id
    private Integer id;

    // 学校名
    private String name;

    // 经度
    private BigDecimal longitude;

    // 纬度
    private BigDecimal latitude;

}

上传位置信息

    public String add(School school) {
        // TODO 更新信息到数据库
        boolean save = this.save(school);
        // TODO 判断是否更新成功
        if(save) {
            // TODO 封装位置信息
            Point point = new Point(school.getLongitude().doubleValue(), 
                    school.getLatitude().doubleValue());
            // TODO 存入数据库
            this.stringRedisTemplate
                    .opsForGeo().add("GEO:SCHOOL", point, school.getName());
        }
        return "成功";
    }

查询附近学校

public void queryMessage() {
        // 距离
        Distance distance = new Distance(30, RedisGeoCommands.DistanceUnit.KILOMETERS);
        // 参数
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs()
                .includeDistance() // 包含距离
                .includeCoordinates() // 包含坐标
                .sortDescending(); // 降序
        // 开始查找
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = this.stringRedisTemplate
                .opsForGeo()
                .radius("GEO:SCHOOL", "SXU", distance, args);
        List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = results.getContent();
        // 输出结果
        for (GeoResult<RedisGeoCommands.GeoLocation<String>> geoLocationGeoResult : content) {
            System.out.println("距离山西大学30公里之内大学的名称:" + geoLocationGeoResult.getContent().getName());
            System.out.println("距离山西大学30公里之内大学的坐标:" + geoLocationGeoResult.getContent().getPoint());
            System.out.println("距离山西大学30公里之内大学的距离:" + geoLocationGeoResult.getDistance());
        }
    }

删除位置信息

    public boolean remove(String name) {
        LambdaQueryWrapper<School> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(School::getName, name);
        boolean subtract = this.remove(lambdaQueryWrapper);
        if(!subtract) {
            return false;
        }
        Long remove = this.stringRedisTemplate.opsForGeo()
                .remove("GEO:SCHOOL", name);
        return remove != null && remove == 1;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AgentTuning:提升大型语言模型的通用Agent能力

人工智能咨询培训老师叶梓 转载标明出处 大模型被用作现实中复杂任务的Agent时&#xff0c;它们的表现往往不如商业模型&#xff0c;如ChatGPT和GPT-4。这些任务要求LLMs作为中央控制器&#xff0c;负责规划、记忆和工具利用&#xff0c;这就需要精巧的提示方法和鲁棒性强的LL…

华为的仓颉和ArkTS这两门语言有什么区别

先贴下官网&#xff1a; ArkTs官网 仓颉官网 ArkTS的官网介绍说&#xff0c;ArkTS是TypeScript的进一步强化版本&#xff0c;简单来说就是包含了TS的风格&#xff0c;但是做了一些改进。 了解TypeScript的朋友都应该知道&#xff0c;其实TypeScript就是JavaScript的改进版本&…

基于springboot 自习室预订系统 前后端分离

基于springboot 自习室预订系统 前后端分离 目 录 摘 要 I Abstract II 第1章 前 言 2 1.1 研究背景 3 1.2 研究现状 3 1.3 系统开发目标 3 第2章 系统开发环境 5 2.1 java技术 5 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 springboot框架 7 2.5 ECLIPSE 开发环境 7 …

Redis的配置与优化

目录 一、关系数据库与非关系型数据库 1.1、关系型数据库 1.2、非关系型数据库 1.3、关系型数据库和非关系型数据库区别 数据存储方式不同 扩展方式不同 对事务性的支持不同 1.4、非关系型数据库产生背景 二、Redis简介 2.1、Redis优点 2.2、Redis为什么这么快 三、…

CefSharp_Vue交互(Element UI)_WinFormWeb应用---设置应用透明度(含示例代码)

一、界面预览 1.1 设置透明(整个页面透明80%示例) 限制输入值:10-100(数字太小会不好看见) 1.2 vue标题栏 //注册类与js调用 (async function(

速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器

一&#xff0c;地址的概念 通常所说的地址指的是某内存单元在整个机器内存中的物理地址&#xff0c;把整个机器内存比作一个酒店&#xff0c;内存单元就是这个酒店的各个房间&#xff0c;给这些房间编的门牌号&#xff0c;类比回来就是内存单元的物理地址 在第一篇介绍debug的…

Scratch植物大战僵尸【机器人vs外星人版本】

小虎鲸Scratch资源站-免费少儿编程Scratch作品源码,素材,教程分享网站! 简介 在这个教学案例中&#xff0c;我们将制作一个类似《植物大战僵尸》的Scratch游戏&#xff0c;主题为“机器人对抗外星人”。这个版本将采用创新的角色设计&#xff0c;机器人将保护地球免受外星人入…

SQL题目分析:打折日期交叉问题--计算品牌总优惠天数

在电商平台的数据分析中&#xff0c;处理品牌促销活动的日期交叉问题是一个挑战。本文将介绍几种高级SQL技巧&#xff0c;用于准确计算每个品牌的总优惠天数&#xff0c;即使在存在日期交叉的情况下。 问题背景 我们有一个促销活动表 shop_discount&#xff0c;记录了不同品牌…

算法:76.最小覆盖子串

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 还是老样子&#xff0c;连续问题&#xff0c;滑动窗口哈希表 令t用的hash表为hash1&#xff0c;s用的hash表为hash2 利用hash表统计窗口内的个字符出现的个数&#xff0c;与hash1进行比较 选…

SpringBoot 消息队列RabbitMQ在代码中声明 交换机 与 队列使用注解创建

创建Fanout交换机 Configuration public class FanoutConfig {Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("csdn.fanout");//交换机名称} }创建队列 Beanpublic Queue fanoutQueue3(){return new Queue("csdn.queue");}绑定…

Nature Climate Change | 全球土壤微生物群落调控微生物呼吸对变暖的敏感性(Q10)

本文首发于“生态学者”微信公众号&#xff01; 全球变暖将加速有机物分解&#xff0c;从而增加土壤中二氧化碳的释放&#xff0c;触发正的碳-气候反馈。这种反馈的大小在很大程度上取决于有机质分解的温度敏感性(Q10)。Q10仍然是围绕土壤碳排放到大气的预测的主要不确定性来源…

软考架构-层次架构风格

一、两层C/S架构 客户端和服务器都有处理功能。处理在表示层&#xff08;客户端&#xff09;和数据层&#xff08;服务器&#xff09;进行 二、三层C/S架构 将处理功能独立出来。表示层在客户机上&#xff0c;功能层在应用服务器上&#xff0c;数据层在数据库服务器上。 三…

玄机科技浪漫绘情缘:海神缘下,一吻定情

在史莱克学院那片璀璨星空的见证下&#xff0c;《斗罗大陆II绝世唐门》第65集“海神缘相亲大会”的浪漫序幕&#xff0c;温柔地触动了每一位观众的心弦。 本集中&#xff0c;霍雨浩与王冬之间那段跨越重重障碍、终得相守的浪漫告白&#xff0c;在玄机科技独特的审美视角、精细…

强化学习Reinforcement Learning|Q-Learning|SARSA|DQN以及改进算法

一、强化学习RL 强化学习是机器学习的一个重要的分支&#xff0c;是一种有效的工具&#xff0c;在文献中被广泛用于解决MDP问题。在一个强化学习过程中&#xff0c;一个智能体只能通过和它所处的环境互动学习最优策略。特别地&#xff0c;智能体首先观察自己当前的状态&#xf…

JVM 内存模型:堆、栈、方法区讲解

1. 引言 Java 虚拟机&#xff08;JVM&#xff09;的内存模型是 Java 程序运行时的基础之一。JVM 内存模型主要包括 堆、栈、和 方法区。它们各自有不同的作用和管理方式&#xff0c;并且影响着程序的性能和稳定性。为了更好地理解 JVM 的内存管理机制&#xff0c;我们将结合电…

数据结构——串的定义及存储结构

串的定义 串&#xff08;string&#xff09;——零个或多个任意字符组成的有限序列串是内容受限的线性表 串的几个术语 子串&#xff1a;串中任意几个连续字符组成的子序列称为该串的子串&#xff08;真子串是指不包含自身的所有子串&#xff09;主串&#xff1a;包含子串的串…

学习笔记(一)

前言 一、对象 1、由类建模而成&#xff0c;是消息、数据和行为的组合 2、可以接收和发送消息&#xff0c;并利用消息进行彼此的交互。消息要包含传送给对象接收的信息 3、类的实例化&#xff1a;把类转换为对象的过程叫类的实例化。 4、对象的特性 (1) 对象有状态&#…

架构师知识梳理(七):软件工程-工程管理与开发模型

软件工程概述 软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析过程&#xff0c;任务是确定软件开发工程必须完成的总目标&#xff0c;具体可分成问题定义、可行性研究、需求分析等。软件开发时期&#xff1a;就是软件的设计与实现&#xff0c;可分成…

解决VSCode文件的中文GBK和UTF-8编码之间乱码问题

NOTE&#xff1a;近日笔者在使用VSCode编码环境的时候&#xff0c;出现了中文和UTF-8两者之间乱码的问题&#xff0c;特编写本片文章&#xff0c;以作学习记录。 1.需求 用VSCode打开外部的GBK2312编码文件&#xff0c;想在VSCode中统一以UTF-8编码查看&#xff08;笔者推荐U…

作文网源码 范文论文网模板 带会员系统+支付接口+整站数据

织梦CMS仿某中国作文网源码,文章类网站源码数据采集&#xff0c;采集可能会失效哦&#xff0c;非常漂亮的模板程序。模板divcss设计&#xff0c;符合W3C标准&#xff0c;已做好SEO优化&#xff0c;收录爆增&#xff0c;排名好&#xff0c;模板清爽&#xff0c;漂亮。本站修复了…