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

Redis地理位置相关应用

下面是一个结合 MySQL 数据库和 Redis 的地理位置服务示例,包含表结构、PHP 代码和 Redis 操作,用于处理基于地理位置的数据存储和查询。

1. 创建 MySQL 数据库表

首先,创建一个用于存储位置信息的 MySQL 表,如下所示:

CREATE TABLE locations (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,latitude DOUBLE NOT NULL,longitude DOUBLE NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 将位置信息存储到 MySQL 和 Redis

在 PHP 中,我们可以将用户或商家的地理位置存储到 MySQL 数据库,并同步存储到 Redis 中。

// 数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=geo_db', 'username', 'password');// Redis 连接
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);// 示例数据
$name = "Sample Location";
$latitude = 37.7749;
$longitude = -122.4194;// 插入到 MySQL
$stmt = $pdo->prepare("INSERT INTO locations (name, latitude, longitude) VALUES (?, ?, ?)");
$stmt->execute([$name, $latitude, $longitude]);// 获取插入的记录ID
$locationId = $pdo->lastInsertId();// 插入到 Redis Geo 数据结构
$redis->geoAdd('locations_geo', $longitude, $latitude, $locationId);

3. 根据当前位置查询附近的地点

使用 Redis 的 GEORADIUS 命令查询某个地理位置附近的所有地点,并返回相应的 MySQL 数据。

// 用户当前位置
$userLat = 37.7749;
$userLng = -122.4194;// 查询 Redis 中的附近地点,半径10公里以内
$nearbyLocationIds = $redis->geoRadius('locations_geo', $userLng, $userLat, 10, 'km', ['WITHDIST']);// 准备查询ID集合
$ids = array_map(function($item) {return $item[0];
}, $nearbyLocationIds);// 如果存在附近地点,查询详细信息
if (!empty($ids)) {$placeholders = str_repeat('?,', count($ids) - 1) . '?';$stmt = $pdo->prepare("SELECT * FROM locations WHERE id IN ($placeholders)");$stmt->execute($ids);$locations = $stmt->fetchAll(PDO::FETCH_ASSOC);foreach ($locations as $location) {echo "Name: " . $location['name'] . ", Distance: " . $nearbyLocationIds[array_search($location['id'], $ids)][1] . " km\n";}
} else {echo "No nearby locations found.\n";
}

4. 计算两个位置之间的距离

通过 Redis 的 GEODIST 命令可以快速计算两个位置之间的距离。

$locationId1 = 1; // Palermo
$locationId2 = 2; // Catania$distance = $redis->geoDist('locations_geo', $locationId1, $locationId2, 'km');
echo "Distance between Location 1 and Location 2: $distance km\n";

总结

通过这种方式,Redis 用于快速的地理位置查询和距离计算,而 MySQL 则存储详细的位置信息。结合两者,可以实现高效的地理位置服务,适用于各种需要地理信息处理的场景,如本地搜索、物流跟踪等。

相关文章:

Redis地理位置相关应用

下面是一个结合 MySQL 数据库和 Redis 的地理位置服务示例,包含表结构、PHP 代码和 Redis 操作,用于处理基于地理位置的数据存储和查询。 1. 创建 MySQL 数据库表 首先,创建一个用于存储位置信息的 MySQL 表,如下所示&#xff1…...

优化WAN流量:如何通过调整系统设置降低企业网络成本

一、症状与问题背景 当电脑显示空闲状态时,如果满足以下条件,第二拨号链接可能会意外激活: 您正在使用基于 Microsoft Windows 的计算机,该计算机连接到远程网络并且是 Active Directory 域服务 (AD DS) 域的成员。 您通过二级…...

Java-HttpHeaders请求头或响应头

HttpHeaders 是 Spring Framework 中的一个类,用于封装 HTTP 头部信息。它提供了一种方便的 方式来设置 HTTP 请求头和处理 HTTP 响应头。下面分别介绍如何使用 HttpHeaders 来设置请求 头和处理响应头。 设置请求头 在发送 HTTP 请求时,可以通过 HttpHeaders 设置各种请…...

Elasticsearch高阶查询

Elasticsearch高阶查询 文章目录 Elasticsearch高阶查询相关性和相关性算分相关性 (Relevance)什么是TF-IDFBM25explain关键字Boosting如何通过Boost控制想要的文档排在前面? 布尔查询(bool Query)查询语法语法格式 单字符串多字段查询三种场…...

【流媒体】RTMPDump—RTMP_Connect函数(握手、网络连接)

目录 1. RTMP_Connect函数1.1 网络层连接(RTMP_Connect0)1.2 RTMP连接(RTMP_Connect1)1.2.1 握手(HandShake)1.2.2 RTMP的NetConnection(SendConnectPacket) 2.小结 RTMP协议相关&am…...

通过https方式访问内网IP

单位要做个用浏览器扫二维码的功能。我先在本地测试一直不成功,后来放到服务器上运行成功了。比较了一下,服务器上是https,但是本地没有证书。我问了一下信安的同事,要求二维码必须在本地扫描,不能上公网。所以只好在本…...

flutter 键盘弹出 都会重新Build

原因是调用MediaQuery.of(context)后,点击TextField组件时会导致调用build方法。 解决方法:在Scaffold组件的body嵌套Builder组件,然后设置一个BuildContext变量,将Builder组件中的context传递给BuildContext变量,然后…...

RedisDistributedLock 分布式锁

设计一个简单的 RedisDistributedLock 类,实现单例模式,并包含基本的锁定机制。这个类将使用 Redis 来管理锁,确保在分布式系统中资源的同步访问 import redis.clients.jedis.Jedis;public class RedisDistributedLock {private static Redi…...

Java之包装类

Java中的包装类(Wrapper Classes)是基本数据类型的对象包装类。Java为每个基本数据类型(如int、char等)提供了对应的包装类,使得基本类型可以被当作对象来处理。这些包装类位于java.lang包中。 包装类的用途 对象化&a…...

Linux - 权限

文章目录 一、用户二、文件 一、用户 1、Linux下有两种用户:超级用户(root)、普通用户。 超级用户:可以再linux系统下做任何事情,不受限制 。 普通用户:在linux下做有限的事情。 超级用户的命令提示符是“…...

免费图形化nginx管理工具nginxWebUI

nginxWebUI是一款图形化管理nginx配置得工具, 可以使用网页来快速配置nginx的各项功能, 包括http协议转发, tcp协议转发, 反向代理, 负载均衡, 静态html服务器, ssl证书自动申请、续签、配置等, 配置好后可一建生成nginx.conf文件, 同时可控制nginx使用此文件进行启动与重载, 完…...

编程上的挫折不可怕,可怕的是你畏惧了

如何克服编程学习中的挫折感 编程学习之路上,挫折感就像一道道难以逾越的高墙,让许多人望而却步。然而,真正的编程高手都曾在这条路上跌倒过、迷茫过,却最终找到了突破的方法。那么,我是如何在Bug的迷宫中找到出口的&…...

docker逃逸手法

docker逃逸手法 基本docker操作docker 命令dockerfilesDocker Compose漏洞利用容器漏洞 基本docker操作 docker 命令 # docker拉取 docker pull # 指定版本拉取 docker pull ubuntu:22.04# 显示镜像可执行的操作 docker image # 列出存储在本地系统上的所有图像 docker image…...

3 pytest Fixture

3 pytest Fixture 3.1 通过 conftest.py 共享 fixture3.2 使用 fixture 执行配置及销毁逻辑3.3 使用 --setup-show 回溯 fixture 的执行过程3.4 使用 fixture 传递测试数据3.5 使用多个 fixture3.6 指定 fixture 作用范围3.7 使用 usefixtures 指定 fixture3.8 为常用 fixture …...

pinctl 和 gpio子系统驱动

一.设备树中添加pinctl节点模板 1.创建对应的节点 同一个外设的 PIN 都放到一个节点里面,打开 imx6ull-14x14-evk.dts,在 iomuxc 节点 中的“imx6ul-evk”子节点下添加 “pinctrl_test” 节点。添加完成以后如下所示: pinctrl_test:test_g…...

RocketMQ消息堆积了怎么解决?

RocketMQ 的消息堆积,一般都是因为客户端本地消费过程中,由于消费耗时过长或消费并发度较小等原因,导致客户端消费能力不足,出现消息堆积的问题。 当线上出现消息堆积的问题时,一般有以下几种方式来解决: 增加消费者…...

C++第十二弹 -- STL之list模拟实现

文章索引 前言模拟实现list1. ListNode节点类2. list的迭代器封装3. 反向迭代器4. list类的模拟实现测试代码 list的反向迭代器总结 前言 通过模拟实现可以让我们更加深刻的理解C底层STL的实现逻辑, 本篇就对list的底层进行模拟实现. 博客主页: 酷酷学!!! 点击关注 共同进步!…...

Destiny of Gods首轮测试正式开启,参与玩家数量突破10万

天神风云,波澜再兴,GameFi链游聚合平台Destiny of Gods首款同名数字卡牌回合制游戏首轮测试定档8月20日20:00(GMT8),现已正式开启! 这是一个由人、游灵和神灵共存的世界,历经蛮荒时期的纷争与信…...

QT聊天室基于Tcp

server.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this)) // 给服务器指针对象实例化空间{ui->setupUi(this); }Widget::~Widget() {delete ui; }…...

公开课观后感:密歇根大学python for everyone

从2024年1月17日到2024年8月20日,终于将密歇根大学的python for everyone的python公开课跟完。站在一月份规划的时刻来看,比我想象中花费的时间更多,我当时肯定没有想到要花上整整七个月的时间才能将这个公开课的内容看完,毕竟这个…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

HTML 列表、表格、表单

1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...