当前位置: 首页 > 原理解释

redis geohash 核心原理-核心原理:定位定位

实际上想搞懂 Redis Geohash,根本不用看那些大书,翻个地摊货要么去查 Google 的文档就行。 拿个笔在纸上画个十字,四个象限,这就是 GeoHash 的雏形。它那个名字听起来挺高大上,实际上就是一场挺无聊的数学游戏。核心意思就是,把地球上的坐标点,强行塞进一个比它二维还小的数字空间里。 这个空间,叫 64 位哈希。
为啥是 1000 万点?出于 2^20 正好接近 1000 万,这就意味着你能够把地球切成 1000 万份,每一份都能代表一个特定的地理区域。但这还不够,你得把每一份再切分。就像切西瓜一样,切一次变成 2048 块,再切一次变成 4096 块。切得越细,精度越高。 这就得啰嗦两句了,不要管我,直接看数据。假设有个北京奥运会比赛地点,坐标是北纬 39.9042,东经 116.4074。把它转成 Geohash 字符串,可能会变成 g:K24h...621... (这个字符串特别长,大约 200 多字符)。
这里面的每一个字母代表切分的一刀。 你能够把它想象成注塑模具。注塑的时候,先拉出 1 毫米厚的料,那就算一刀。拉了 100 毫米,再拉 100 毫米,直到拉成 100 毫米的条。
这时候你再切,一毫米变 10 毫米,再变 20 毫米,最终变成 1 毫米的料,直接注塑成一根铁棒。 这逻辑在 GIS 软件里是通用的,比如 QGIS。你拉出 1mm 分界线,拉 10mm,拉 20mm,一直拉到 1mm。 可是,Redis 的 Geohash 多了一个特征,就是效率。它不像传统算法那样每切一刀都要重新计算,而是利用重复前缀的特性。
比如 g:K24h...621...,你不需求知道后面那 1000 个数字具体代表啥,只要知道前缀 g:K24h... 已经代表了一大片区域,你直接把后边那一局部拼起来就行。 举个例子,假设你有一个点 g:K24h...621...,再给你两个点 g:K24h...622... 和 g:K24h...623...。
要是你把这三个点按字典序排列,你会发现 g:K24h...622... 和 g:K24h...623... 的差别,就只在前面的那几百个数字里。 这就好比你在码上写文件。你只需求关切开头的数字变化,后面的数字对于比较目标来说,实际上差不多。你不用去逐位分析,直接对比前缀即可。 这实际上就是一种“局部最优”的决策过程。你不需求知道全局的全局最优解,只需求知道当前这一步解得如何样就行。 为了防止哈希空间溢出,Redis 会自动处理一些边界情况。
比方说,当你的 Hash 值超过了 1000 万分之一时,它会自动断开。 就像一个人步行,要是走得忒快,脚碰到了墙,就得停下来调整方向,要么换一条路走。GeoHash 也是这个道理。当计算出的哈希值忒大,超过了设定的范围,程序就得强制截断,然后重新计算。 这个过程实际上贼暴力,但也贼快。出于只要前缀不变,后面的数字变化对整体顺序效应影响简直为零。 这就像一个字符串排序。你有一万个单词,你要按字母顺序排。你不需求去比较每个单词的每一个字母,只需求看前几个字母是不是不一样的。
那 99% 的工夫,你就连不需求看最终一个字母,直接就能排好序。 这实际上就是为啥 Redis 能如此快处理海量点查询的缘由。它把地球这个庞大的、连续的空间,强行压缩成了一个离散的、高度分组的数字集合。 然后,你只需求在内存里查表,要么用好办的字符串比较,就能找到对应的区域了。 要是你不在内存里查表,那就得像传统算法一样,遍历每一条分界线,把点一个个比对到最近的哈希块里。
那时候,查询速度可能慢到让你质疑人生。 但 Redis 不一样,它把大局部工作都做了。它把那些重复的模式,那些能够优化的局部,都提前算好了。 这就好比你在造房子。
要是你是一栋砖木结构的房子,每加一块砖都得重新算一下整体重心,那效率忒低了。但你用了钢混结构,并且有了预制的钢筋网,你只需求在混凝土里埋上预先计算好的钢筋,剩下的混凝土浇筑,直接盖就是。 GeoHash 就是那根钢筋。你不必为每一块砖都重新计算。 故此,当你看到 Redis 的 Geohash 查询快得离谱时,实际上就看到了这套“半成品”结构在运转。它不需求把地球重新切分,不需求重新计算每一刀,它只需求利用那些已经切好的、已经预计算好的碎片,像搭积木一样拼凑出你需求的结局。 这听起来有点抽象,但原理就在那儿。好办点说,就是别磨蹭,直接拿那些已经切好的、已经算好的、能用的块,拼就是你的。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站