前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis如何让你加到了附近的人

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

作者头像
疯狂的KK
发布2020-10-27 10:11:57
7800
发布2020-10-27 10:11:57
举报
文章被收录于专栏:Java项目实战

近水楼台之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 命令基本语法如下:

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

大key扫描

代码语言:javascript
复制
redis-cli -h 127.0.0.1 -p7001 --bigkeys

预防ops报警

代码语言:javascript
复制
redis-cli -h 127.0.0.1 -p7001 --bigkeys -i 0.1
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 赵KK日常技术记录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语法
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档