08- Redis 中的 GEO 数据类型和应用场景

1. 介绍

Redis GEO 是 Redis 3.2 版本新增的数据类型,主要用于存储地理位置信息,并对存储的信息进行操作。

在日常生活中,我们越来越依赖搜索“附近的餐馆”、在打车软件上叫车,这些都离不开基于位置信息服务(Location-Based Service,LBS)的应用。LBS 应用访问的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO 就非常适合应用在 LBS 服务的场景中。

2. 内部实现

GEO 本身并没有设计新的底层数据结构,而是直接使用了 Sorted Set 集合类型。

GEO 类型使用 GeoHash 编码方法实现了经纬度到 Sorted Set 中元素权重分数的转换,这其中的两个关键机制就是【对二维地图做区间划分】和【对区间进行编码】。一组经纬度落在某个区间后,就用区间的编码值来表示,并把编码值作为 Sorted Set 元素的权重分数。

这样一来,我们就可以把经纬度保存到 Sorted Set 中,利用 Sorted Set 提供的“按权重进行有序范围查找”的特性,实现 LBS 服务中频繁使用的“搜索附近”的需求。

3. 常用命令

# 存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
GEOADD key longitude latitude member [longitude latitude member ...]
​
# 从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nul。
GEOPOS key member [member ...]
​
# 返回两个给定位置之间的距离
GEODIST key member1 member2 [m|km|ft|mi]
​
# 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

4. 应用场景1

4.1 滴滴叫车

这里以滴滴叫车的场景为例,介绍下具体如何使用 GEO 命令:GEOADD 和 GEORADIUS 这两个命令。

假设车辆 ID 是 33,经纬度位置是(116.034579,39.030452),我们可以用一个 GEO 集合保存所有车辆的经纬度,集合 key 是 cars:locations。

执行下面的这个命令,就可以把 ID 号 为 33 的车辆的当前经纬度位置存入 GEO 集合中。

GEOADD cars:locations 116.034579 39.030452 33

当用户想要寻找自己附近的网约车时,LBS 应用就可以使用 GEORADIUS 命令。

例如,LBS 应用执行下面的命令时,Redis 会根据输入的用户的经纬度信息116.054579,39.030452 ),查找以这个经纬度为中心的 5 公里内的车辆信息,并返回给 LBS 应用。

GEORADIUS cars:locations 116.054579 39.030452 5 km ASC COUNT 10

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

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

相关文章

【Go】Swagger v2 转 OpenApi v3 CLI - swag2op

写这个工具的原因,也是受万俊峰老师的启发,他把工作中重复的事情,整合到一个工具,然后开源,这件事很赞。 swag2op 在 【Go】Go Swagger 生成和转 openapi 3.0.3 这篇文档,主要是对 swagger 如何生成&#…

第十六节 huggingface的trainner的_inner_training_loop函数源码解读(step)

文章目录 前言一、完整源码呈现1、内循环运行前参数2、step内循环训练源码二、训练step训练源码解读1、step内循环开始2、_load_rng_state状态载入3、跳过当前epoch的已迭代step4、累计梯度状态记录(self.control)5、模型训练(self.training_step(model, inputs))累计梯度训练…

油封制品中各种橡胶材料的差异

在机械系统中,油封起着关键的作用,其主要功能是防止润滑剂泄漏和污染物进入。油封的性能很大程度上取决于所用的橡胶材料。不同的橡胶化合物各有其独特的特性、优点和应用场景。本文将详细探讨油封制品中各种橡胶材料的差异,重点分析其特性、…

金蝶云星空数据库迁移后,显示 error: 40 - 无法打开到 SQL Server 的连接的解决方法

原因:数据库迁移/或者更新IP后,与之前添加的数据库地址不一致导致无法连接数据库; 解决方法:修改IP为目前数据库的IP; 文件路径:在ManageSite\APP_Data\Common.config中,修改DbServerInstance…

笔记90:C++中sort函数的使用

函数原型&#xff1a;sort ( iterator beg , iterator end , _Pred ) a a 参数介绍&#xff1a; beg&#xff1a;起始迭代器end&#xff1a;终止迭代器Pred&#xff1a;谓词&#xff08;如果不给&#xff0c;默认使用 less<int>() 作为谓词&#xff0c;排序方式为从小到大…

windows系统电脑外插键盘驱动出现感叹号或者显示未知设备,键盘无法输入的解决办法

笔记本外插的键盘不能用&#xff0c;鼠标可以使用。 查找故障&#xff0c;结果打开设备管理器看到键盘那项里是一个的黄色惊叹号显示未知设备&#xff01;[图片]如下图所示 其实解决办法很简单&#xff0c;不要相信网上的一些博主说删除什么注册表&#xff0c;我开始跟着他们操…

[每日一练]按日期分组销售产品的最优解法

该题目来自于力扣的pandas题库&#xff0c;链接如下&#xff1a; 1484. 按日期分组销售产品 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 表 Activities&#xff1a; ---------------------- | 列名 | 类型 | ---------------------- | sell_…

Jetpack架构组件_5.BindingAdapter

1.BindingAdapter介绍 Binding adapters 可以作为一个设置某个值的框架来使用&#xff0c;databinding 库可以允许指定具体的方法来进行相关值的设置&#xff0c;在该方法中可以做一些处理逻辑&#xff0c;Binding adapters 会最终给你想要的结果。Android Databinding框架中已…

embedding模型API启动

Embedding模型API启动 针对一些需要使用api调用的大模型框架&#xff08;如fastGPT&#xff09;&#xff0c;可以用该方法启动Embedding模型 环境问题不过多赘述&#xff0c;代码如下 import uvicorn from pydantic import BaseModel # , Field from fastapi.middleware.co…

创建一个乘法练习题生成器 using Java

在教育软件和家庭学习辅助工具中&#xff0c;自动生成练习题是一种常见的需求&#xff0c;它能够帮助学生通过大量练习来巩固数学基础概念。本文将介绍如何使用Java编程语言创建一个简单的乘法练习题生成器&#xff0c;该程序不仅能够随机生成乘法题目&#xff0c;还能保证输出…

【本地运行chatgpt-web】启动前端项目和service服务端项目,也是使用nodejs进行开发的。两个都运行成功才可以使用!

1&#xff0c;启动web界面 https://github.com/Chanzhaoyu/chatgpt-web#node https://nodejs.org/en/download/package-manager # 使用nvm 安装最新的 20 版本。 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source /root/.bashrc n…

自力更生:0依赖三方库,手把手教你打造专属C++测试框架

前言&#xff1a; 当人们谈到测试框架的时候&#xff0c;首先想到的就是 google 的 gtest&#xff0c; 想着怎么在代码中集成 gtest 的框架&#xff0c;来实现自身代码的测试。 然后就巴拉巴拉的费了老大劲将 gtest 嵌入到自己的代码中来。 诚然&#xff0c;在自身程序接口稳…

huggingface的self.state与self.control来源(TrainerState与TrainerControl)

文章目录 前言一、huggingface的trainer的self.state与self.control初始化调用二、TrainerState源码解读(self.state)1、huggingface中self.state初始化参数2、TrainerState类的Demo 三、TrainerControl源码解读(self.control)总结 前言 在 Hugging Face 中&#xff0c;self.s…

C语言实现十进制转任意进制(详解)

主要思路&#xff1a;运用一个数组&#xff0c;通过数字每次取任意进制模&#xff0c;存在数组中&#xff0c; 再通过倒取数组中的数值&#xff0c;来实现进制转换&#xff0c;如果遇到十六进制&#xff0c;利用ASCII码值 数字字符和大写字母 相差55的特性来解决 int main() {…

【芯片验证方法】

术语——中文术语 大陆与台湾的一些术语存在差别&#xff1a; 验证常用的英语术语&#xff1a; 验证&#xff1a;尽量模拟实际应用场景&#xff0c;比对芯片的所需要的目标功能和实现的功能 影响验证的要素&#xff1a;应用场景、目标功能、比对应用场景、目标功能&#xff…

内存泄露和内存溢出有什么不同

内存泄露和内存溢出是两个常见的内存问题&#xff0c;它们在程序运行过程中可能导致性能下降、系统不稳定甚至应用崩溃。虽然这两个术语经常被混用&#xff0c;但它们描述的是两种不同的问题&#xff1a; 内存泄露&#xff08;Memory Leak&#xff09; 内存泄露是指程序在分配…

华发股份:加强业务协同 新政下项目热销

“5.17”楼市政策出台后&#xff0c;各地密集落地执行。5月27—28日&#xff0c;上海、广州、深圳三个一线城市跟进落地“517”新政。上海发布《关于优化本市房地产市场平稳健康发展政策措施的通知》&#xff0c;共计9条调整政策&#xff0c;涵盖外地户籍、人才、单身、婚否、企…

一个生动的例子——通过ERC20接口访问Tether合约

生动的例子 USDT&#xff1a;符合ERC20标准的美元稳定币&#xff0c;Tether合约获得测试网上Tether合约地址通过自己写的ERC20接口访问这个合约 Tether合约地址&#xff1a;0xdAC17F958D2ee523a2206206994597C13D831ec7 IERC20.sol // SPDX-License-Identifier: GPL-3.0pra…

今日分享站

同志们&#xff0c;字符函数和字符串函数已经全部学习完啦&#xff0c;笔记也已经上传完毕&#xff0c;大家可以去看啦。字符函数和字符串函数and模拟函数 加油&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;

Unix环境高级编程--7-进程环境--7.1-7.2main函数-7.3进程退出

1、几个问题 ①main函数如何被调用&#xff1f; ②命令行参数如何传递给新程序&#xff1f;&#xff1b; ③典型储存空间布局是什么样的&#xff1f;&#xff1b; ④进程如何使用环境变量 &#xff1f;&#xff1b; ⑤进程的各种终止方式&#xff1f; 2、main函数 当内核…