發布時間:2024-01-24閱讀(15)
背景
在review同事代碼時,看到了一個很長的SQL,功能是為用戶找到附近的100個店鋪。我忍不住提出了一種更優雅更快捷的方式:利用redis 的一種在Redis3.2版本中推出高級數據類型GEO(不要再說Redis只有5種數據結構了),特別是數據量比較大時,效率高于MySQL很多。

mysql 計算經緯度
簡介
Redis的GEO可以將用戶給定的地理位置(經度和緯度)信息儲存起來,并對這些信息進行操作。GEO相關命令只有6個:

改進思路
springboot redis實戰
引入jar包

利用StringRedisTemplate API


測試結果
redis計算

MySQL計算

結論: 可見2個的結果一致。
也說原理
我們知道經度范圍(-180,180),緯度范圍(-90,90)。
以緯度為例,用二分法將緯度(-90,90)分成兩個區間,(-90,0)和(0,90),如果目標緯度落在左邊區間則記為0,否則記為1;再將目標緯度所在的那個區間再通過二分法分成兩個相等的區間,如果目標緯度落在左邊區間則記為0,否則記為1,以此類推,可以得到一個二進制數。同理經度也以此可以推導出一個二進制數。
假如得到的經緯度二進制數如下
經度:110101100101001110111100011010 緯度:101011000101010000110101100101
然后通過偶數位放經度,奇數位放緯度將經緯度合并,從0位開始數起(0是偶數位,放經度)
結果
111001100111100000110011000110101000111110110001011010011001
然后按照從左往右,每n位劃分成1個組(n 越小越精確)
假如n為5,則結果
11100 11001 11100 00011 00110 00110 10100 01111 10110 00101 10100 11001
換成十進制,
28 25 28 3 6 6 20 15 22 5 20 25
然后十進制轉base32字符串:4Z4CGGUPWFUZ
如果有另外一個經緯度轉化后為:4Z4CGGUPWFUA,則兩個字符串能匹配11位,比較相似,距離就比較近。

演示視頻
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖