首页 > 数据库 >Redis7 10大数据类型(Redis地理空间)

Redis7 10大数据类型(Redis地理空间)

时间:2023-09-20 22:07:30浏览次数:40  
标签:返回 10 元素 经纬度 数据类型 位置 Redis 给定

一、简介

移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、高德地图附近的核酸检查点等等,那这种附近各种形形色色的XXX地址位置选择是如何实现的?
地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。

例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,
然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆

使用如下SQL即可:
select taxi from position where x0-r < x < x0 + r and y0-r < y < y0+r

但是这样会有什么问题呢?
1.查询性能问题,如果并发高,数据量大这种查询是要搞垮数据库的
2.这个查询的是一个矩形访问,而不是以我为中心r公里为半径的圆形访问。
3.精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差

Redis在3.2版本以后增加了地理位置的处理

二、原理

核心思想就是将球体转换为平面,区块转换为一点

Redis7 10大数据类型(Redis地理空间)_地理位置

三、命令

GEOADD 多个经度(longitude)、维度(latitude)、位置名称(member)添加到指定的key中
GEOPOS 从键里面返回所有给定位置元素的位置(经度和纬度)
GEODIST 返回两个给定位置之间的距离
GEORADIUS 以给定的经纬度为中心,返回与中心的位置不超过给定最大位置的所有位置元素
GEORADIUSBYMEMBER 跟GEORADIUS类似
GEOHASH 返回一个或多个位置元素的GEOHASH表示

四、命令实操

如何获取某个地址的经纬度

http://api.map.baidu.com/lbsapi/getpoint

GEOADD添加经纬度坐标

Redis7 10大数据类型(Redis地理空间)_ci_02

中文乱码如何处理

Redis7 10大数据类型(Redis地理空间)_数据库_03

GEOPOS返回经纬度

Redis7 10大数据类型(Redis地理空间)_ci_04

GEOHASH返回坐标的geohash表示

Redis7 10大数据类型(Redis地理空间)_数据库_05

geohash算法生成的base32编码值
3纬变2纬变1纬

Redis7 10大数据类型(Redis地理空间)_数据库_06

GEODIST两个位置之间距离

Redis7 10大数据类型(Redis地理空间)_ci_07

后面参数是距离单位:
m 米
km 千米
ft 英尺
mi 英里

GEOREDIUS

georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord withhash count 10 desc

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大
COUNT 限定返回的记录数。

当前位置(116.418017 39.914402),阳哥在北京王府井

Redis7 10大数据类型(Redis地理空间)_ci_08

GEOREDIUSBYMEMBER

Redis7 10大数据类型(Redis地理空间)_地理位置_09

五、应用场景

地图附近酒店推送、美食推荐

标签:返回,10,元素,经纬度,数据类型,位置,Redis,给定
From: https://blog.51cto.com/u_13236892/7542809

相关文章

  • 10个最佳 python 装饰器
    From: https://mp.weixin.qq.com/s/3-1TikeOeLZilHnPzM9I-Q---------------------------------------------------------------------------------装饰器是可以为你的函数添加新功能的秘密武器,使你的代码更加优雅和高效。今天我们将探讨可以增强你的函数的10个最佳Python装......
  • 引入数据类型无过程值?
    案列代码如下//优秀学生案例constobj={name:'小红',age:18,message:'该学生成绩优异'}//有些学生列表,但无学生评语,即messageconstobjList=[{name:'小红',age:17},{name:'小明',age:17},{name:'小绿',age:18},{name:'小蓝',age:17}]//现在想让这个列表里......
  • 【230920-6】勾画对数函数y=log10_x
    【图像】【代码】<!DOCTYPEhtml><htmllang="utf-8"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><head><title>19.函数y=log_2_X图示</title><styletype="text/c......
  • Redis学习之缓存穿透
    缓存穿透攻击者可以恶意请求数据库中不存在的数据,从而使得每次查询都要绕过缓存查数据库,增大数据库的压力。解决方案:1.缓存空值:比如塞一个空字符串。注意可以给空对象的键过期时间设置短一些,或者在新增数据时强制清除下对应缓存(防止查出来还是null)2.布隆过滤器预防做法:......
  • [EFI]华硕 Asus VivoBook S510UA 电脑 Hackintosh 黑苹果efi引导文件
    此文章资源下载请前往黑果魏叔官网下载硬件型号驱动情况主板AsusVivoBookS510UABQ514T处理器IntelCorei5-8250UKabyLakeR8thGen.i5已驱动内存8GB(三星DDR42400MHz8GB)已驱动硬盘镁光_1100_MTFDDAV512TBN(512GB/固态硬盘)已驱动显卡IntelUHD620已驱动声卡C......
  • Redis学习之缓存实现及缓存更新
    介绍什么是缓存?缓存就是数据交换的缓冲区(称作Cache[kæʃ]),是存贮数据的临时地方,一般读写性能较高。为什么需要缓存?提前准备好数据,便于更快地读写。 缓存是把双刃剑,要权衡利弊。优点:降低后端负载提高读写效率,降低响应时间缺点:数据一致性成本代码维护成本运维......
  • Redis 面试常见问答
    本文出自:https://thinkinjava.cn作者:莫那鲁道1\.什么是缓存雪崩?怎么解决?一般而言,我们会利用缓存来缓冲对数据库的冲击,假如缓存无法正常工作,所有的请求便会直接发送至数据库,进而导致数据库崩溃,从而导致整个系统崩溃。如何解决呢?2种策略(同时使用):对缓存做高可用,防止缓存宕机使用断......
  • Redis的五中数据类型以及应用场景
    1.string字符串在redis中string是可以修改de被称之为动态字符串.其中内部更像arraylist内部维护一个字节数组,在其内部分配了一定的空间.内存分配机制当字符串的长度小于1m的时候,每次扩容都是加倍空间当字符串长度超过1m的时候每次扩容只会扩张1m的空间字符串的最大长度......
  • Redis之Sentinel哨兵监控
    哨兵简介 1.redis提供了哨兵的命令,是一个独立的进程 2.哨兵通过发送命令给节点,通过redis节点响应达到监控多个redis实例的运行情况 3.当哨兵发现master宕机,会自动将从节点切换成主节点,并通知其他的从节点,修改配置文件切换主机 4.默认端口是26379哨兵的主要任务 1.......
  • Redis 不同插入方法的性能对比
    1.测试目的对比Redis不同插入方法(插入同时能设置过期时间)的性能区别。2.测试数据key:SMGP_value:JSON数据{ "spName":"100003", "protocol":"SMGP", "remoteAddress":"192.192.192.192:44192", "host":"192.192......