久久综合九色综合97婷婷-美女视频黄频a免费-精品日本一区二区三区在线观看-日韩中文无码有码免费视频-亚洲中文字幕无码专区-扒开双腿疯狂进出爽爽爽动态照片-国产乱理伦片在线观看夜-高清极品美女毛茸茸-欧美寡妇性猛交XXX-国产亚洲精品99在线播放-日韩美女毛片又爽又大毛片,99久久久无码国产精品9,国产成a人片在线观看视频下载,欧美疯狂xxxx吞精视频

有趣生活

當前位置:首頁>職場>mysql查看用戶(還在用MySQL計算用戶距離嗎)

mysql查看用戶(還在用MySQL計算用戶距離嗎)

發布時間:2024-01-24閱讀(15)

導讀背景在review同事代碼時,看到了一個很長的SQL,功能是為用戶找到附近的100個店鋪。我忍不住提出了一種更優雅更快捷的方式:利用redis的一種在Red....

背景

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

mysql查看用戶(還在用MySQL計算用戶距離嗎)(1)

mysql 計算經緯度

簡介

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

mysql查看用戶(還在用MySQL計算用戶距離嗎)(2)

改進思路

  1. 將店鋪信息存儲在Redis中
  2. 利用Redis的GEORADIUS 查出附近的10個店鋪

springboot redis實戰

引入jar包

mysql查看用戶(還在用MySQL計算用戶距離嗎)(3)

利用StringRedisTemplate API

mysql查看用戶(還在用MySQL計算用戶距離嗎)(4)

mysql查看用戶(還在用MySQL計算用戶距離嗎)(5)

測試結果

redis計算

mysql查看用戶(還在用MySQL計算用戶距離嗎)(6)

MySQL計算

mysql查看用戶(還在用MySQL計算用戶距離嗎)(7)

結論: 可見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位,比較相似,距離就比較近。

mysql查看用戶(還在用MySQL計算用戶距離嗎)(8)

演示視頻

TAGS標簽:  mysql  查看  用戶  在用  mysql查看用戶(

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