2013-11-02 65 views
0

我喜歡在基於位置的數據高速緩存(在服務器上)系統中爲移動應用程序提供數據。即如果某用戶從一個位置請求數據(這對所有來自同一區域的用戶都是共同的),我會從數據庫中獲取值並向他們顯示。但是,如果第二個用戶在同一位置的下一個5分鐘內檢索同一頁面,那麼我不想查詢數據庫中存在的數百萬條記錄,如果它存在於文件緩存中,我可以將它們帶走。那麼現在在PHP中可用的這些東西?基於位置的高速緩存系統

+0

運行你的意思是在同一臺計算機上,或只是在相同的位置(比如在同一個IP或東西) – putvande

+0

@putvande在服務器上。所以我可以減少負載到DB,因爲它有超過一百萬條記錄.. – Stranger

+0

我不認爲你能夠做到這一點。 – putvande

回答

4

我不知道PHP中有這樣的事情,但用PHP創建自己的緩存引擎並不難。你需要創建一個緩存目錄,並根據你得到的請求來檢查你的緩存目錄中是否存在與該請求相對應的文件。

例如您的主要參數是lat和long。 假設你得到lat = 123和long = 234(取一些隨機值)的請求,你將檢查你的緩存文件夾是一個名爲123_234.data的文件是否存在。如果存在,則不是查詢數據庫,而是讀取文件並將內容作爲輸出發送,否則從數據庫中讀取數據,並在發送響應之前在文件緩存/ 123_234.data中寫入該響應。這樣您可以稍後再處理文件,而無需再次查詢數據庫。

挑戰:

  1. 時間:緩存會在某些時候或其他到期。因此,在檢查文件是否存在的同時,還需要檢查上次修改的時間戳以確保緩存未過期。如果緩存在一分鐘,十分鐘,幾小時,幾天或幾個月內過期,則這取決於您的應用程序要求。
  2. 在這種情況下製作智能緩存文件名稱將會具有挑戰性,因爲即使距離爲100米,lat,long組合也會有所不同。一種選擇可能是通過設置精度來選擇文件名。例如真正的經緯度組合是28.631541,76.945281的形式。您可能想要創建一個名爲28.63154_76.94528.data的緩存文件(將精度值降至10位後的5個位置)。這又取決於您是否想要緩存地球上或地理區域上的單個點,以及地理區域,然後是其半徑。

我不知道爲什麼有人投下了這個問題,我相信這是一個非常好的和聰明的問題。有我的upvote :)

+0

真的,我很欣賞你的答案,這是有道理的。 – Stranger

1

如果所有你關心的是查詢......一種方法可能是一個數據庫表查詢結果存儲爲json或序列化的php對象以及任何你需要匹配位置的字段。

一個cron作業上的任何間隔時間最適合將清除過期的結果

+0

寶貴的答案..但是,當它變得越來越大時,您對性能的看法如何? – Stranger

+0

肯定是一個簡單的實施。真的取決於你的後端資源和你想要優化什麼 – charlietfl

+0

當我們有更多的用戶時,DBs的性能(當它變得巨大時)會再次變得更慢,這使得巨大DB中的檢索速度也變慢了吧? – Stranger