Redis地理位置相关应用

2024-08-22 01:12

本文主要是介绍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地理位置相关应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094818

相关文章

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总