近水楼台之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]
大key扫描
redis-cli -h 127.0.0.1 -p7001 --bigkeys
预防ops报警
redis-cli -h 127.0.0.1 -p7001 --bigkeys -i 0.1