Redis如何让你加到了附近的人

举报
赵KK日常技术记录 发表于 2023/06/24 11:51:58 2023/06/24
【摘要】 近水楼台之GeoHashRedis3.2开始的Geo模块.可通过二维的经纬度表示.使用勾股定理算出元素之间的距离,通过矩形区域现定元素数量,然后按着距离排序。其次,交友软件中附近的人非常频繁,所以推出了Redis的地址位置距离排序算法GeoHash。本质上GeoHash算是一种数据结构吗?不是的,本质上还是zset,对应的操作就是skiplist,Redis中处理这些地理位置坐标点的思想是:...

近水楼台之GeoHash

Redis3.2开始的Geo模块.可通过二维的经纬度表示.使用勾股定理算出元素之间的距离,通过矩形区域现定元素数量,然后按着距离排序。其次,交友软件中附近的人非常频繁,所以推出了Redis的地址位置距离排序算法GeoHash。

本质上GeoHash算是一种数据结构吗?不是的,本质上还是zset,对应的操作就是skiplist,

Redis中处理这些地理位置坐标点的思想是:二维平面坐标点 --> 一维整数编码值 --> zset(score为编码值) --> zrangebyrank(获取score相近的元素)、zrangebyscore --> 通过score(整数编码值)反解坐标点 --> 附近点的地理位置坐标。

请在此添加图片描述

基本命令

GEOADD key longitude latitude member [longitude latitude member …]

字段的介绍:

key标识一个地理位置的集合。

longitude latitude member标识了一个地理位置的坐标。

longitude是地理位置的经度,

latitude是地理位置的纬度。

member是该地理位置的名称。

geoAdd可以批量给集合添加一批地理位置

请在此添加图片描述

geopos 可以获取地理位置的坐标,可以批量获取多个地理位置的坐标,命令格式为:GEOPOS key member [member …]

请在此添加图片描述

geodist 用来获取两个地理位置的距离,命令格式为:

单位可以指定为以下四种类型:

m:米,距离单位默认为米,不传递该参数则单位为米。

km:公里。

mi:英里。

ft:英尺。

请在此添加图片描述

georadius 可以根据给定地理位置坐标获取指定范围内的地理位置集合。命令格式为:

GEORADIUS key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

longitude latitude标识了地理位置的坐标,

radius表示范围距离,距离单位可以为m|km|ft|mi,还有一些可选参数:

WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。

WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。

ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。

WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。

COUNT count:传入COUNT参数,可以返回指定数量的结果。

georadiusbymember 可以根据给定地理位置获取指定范围内的地理位置集合。

georadius命令传递的是坐标,

georadiusbymember传递的是地理位置。

georadius更为灵活,

可以获取任何坐标点范围内的地理位置。但是大多数时候,只是想获取某个地理位置附近的其他地理位置,使用georadiusbymember则更为方便。

georadiusbymember命令格式为(命令可选参数与georadius含义一样):

georadiusbymember key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

请在此添加图片描述

他不会排除自身

因为附近应用中出现的数据会出现大量的餐馆,加油站等,建议按城市,区域等进行划分来降低单个集合的大小。

众里寻他千百度 scan

如何在成千上万个key中删除特定前缀的key或者修改呢。

请在此添加图片描述

请在此添加图片描述

keys*是遍历算法,复杂度是O(n),如果满足条件的是几百万个大数据量则满屏刷屏,造成卡顿

sacn复杂度也是O(n),但是他是通过游标分步进行的,不会阻塞线程

啥是游标分布?每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

语法

redis Scan 命令基本语法如下:

SCAN cursor [MATCH pattern] [COUNT count]
  • cursor - 游标。
  • pattern - 匹配的模式。
  • count - 指定从数据集里返回多少元素,默认值为 10 。

请在此添加图片描述

大key扫描

redis-cli -h 127.0.0.1 -p7001 --bigkeys

预防ops报警

redis-cli -h 127.0.0.1 -p7001 --bigkeys -i 0.1

请在此添加图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。