高朋Groupon使用 Redis 每分鐘擴充套件數百萬個地理空間查詢

banq發表於2021-06-16

為了讓高朋Groupon使用者附近找到相關的交易,需要進行大量的地理空間搜尋。這些搜尋是在地理空間實體上執行的,例如郵政編碼、時區、社群或興趣點。每分鐘以低延遲提供數百萬次查詢需要高效的空間索引器進行最佳化。
本文介紹了 Groupon 如何使用 Redis 來支援兩種主要型別的地理空間搜尋 - 查詢最近的實體和查詢半徑內所有附近的實體。我們還將瞭解 Redis 叢集如何提供可擴充套件和高效能的解決方案。
Redis 提供了GEOADDGEORADIUSGEORADIUSBYMEMBERGEOSEARCHGEOSEARCHSTORE等命令,用於地理空間索引和搜尋。空間實體儲存在排序集中,座標使用Geohash技術形成 52 位整數。
 

為什麼要使用Redis?
有很多解決方案可用於實現空間搜尋。Quadtree、R-tree 和 Kd 樹等資料結構可用於索引實體。S2 和 H3 等地理空間索引器可用於類似的查詢。
但是,Redis 在可擴充套件性、效能和可用性方面具有優勢。與其他解決方案相比,Redis 有幾個優勢:

1. 可擴充套件性
從時間複雜度可以看出,隨著地理資料量的增加,命令執行的時間也會增加。使用的記憶體也必然會增加。在這種情況下,Redis 叢集可以隨著資料量的變化而擴充套件。
Redis 叢集有兩種擴充套件方式——水平擴充套件和垂直擴充套件。

  • 水平擴充套件允許在叢集中新增或刪除節點(分片)。即使在重新分片期間,叢集也會繼續為請求提供服務,同時擴充套件/縮小。
  • 垂直擴充套件允許在為請求提供服務時更改節點的大小以進行向上/向下擴充套件。

2. 高可用
Redis 叢集透過複製提供高可用性。主節點可以跨物理機架(或資料中心)配置多個副本。Redis 叢集也支援自動故障轉移。

3. 效能
Redis 是一種記憶體資料儲存,其資料結構針對效能進行了最佳化。但是,在對地理空間查詢的效能進行基準測試和調整時,需要牢記以下幾點:

  • GEOADD 和 GEORADIUS 命令的時間複雜度分別為 O(log(N)) 和 O(N + log(M))。保持金鑰大小小並且資料分割槽是很重要的,以避免任何單個節點過載。半徑的增加會導致命令執行時間增加。
  • 客戶端使用 TCP 連線與 Redis 伺服器通訊。客戶端套接字處於非阻塞狀態,因為 Redis 使用多路複用和非阻塞 I/O。應啟用 TCP Keepalive 以進行效能調整。Keepalive 是一種允許使用相同的 TCP 連線而不是為每個新請求開啟一個新連線的方法。
  • 水平擴充套件允許鍵分佈在分片上,並透過減少每個分片的負載來提高效能。
  • 如果啟用了Redis叢集模式,則不需要RDB持久化和AOF。
  • 預設情況下,Redis 允許 10,000 個客戶端連線,並且可以進行配置。
  • Redis 命令的效能可以使用redis-benchmark實用程式進行基準測試


 

相關文章