2012-11-29 38 views
1

在我的Rails應用程序的某個時候,我從緩存中檢索了大量的ActiveRecord對象。但是,有些記錄可能已從數據庫本身中刪除,因爲它們存儲在緩存中,所以我循環記錄並檢查每個記錄是否存在。這需要相當長的時間。有沒有更有效的方法來做到這一點?如何快速檢查數據庫中是否存在大量記錄?

+5

這只是[計算機科學中最難的兩件事]之一(http://martinfowler.com/bliki/TwoHardThings.html) –

+0

@Danny - 您的評論如何有用?我不明白爲什麼有人會簡單地說這是非常困難的,並認爲它以任何方式遠程幫助。你是說忘記它,重新設計你的代碼? –

+0

@jimmcnamara - 感謝您的反饋!你是對的,我的評論並不特別清楚。我只想補充一點,就是認識到這是編碼中很難做到的事情之一,希望能帶上一點幽默感。 –

回答

2

當你從數據庫中刪除記錄時,是否沒有將記錄從緩存中刪除?

如果您打算將這些記錄存儲在緩存中,並且需要它們與db同步,那麼當您從db中刪除它們時,請確保從緩存中刪除它們的存在,因此可以節省昂貴的代價稍後必須檢查冗餘數據的查詢。

1

這也可以被認爲是一個數據庫設計問題,而不是一個真正的鐵軌問題。考慮到這一點,你可以添加一個AUTO INCREMENT字段,並在表中添加一個唯一的索引嗎?

即使執行記錄存在檢查,活動記錄查詢接口也必須依賴數據庫最終進行查找。所以,不管接口有多好,如果db需要做很多工作,它需要時間,而不是一個「故障」。讓數據庫儘可能快地驗證你想要的記錄。

如果您熟悉oracle,這與將oracle rowid存儲在查詢中以便能夠稍後驗證現有記錄的想法相同。

由於Danny似乎表明,也許緩存大量記錄並在以後使用它們對您的應用程序來說是個壞主意。你可以閱讀,然後立即處理你的記錄?

這些建議都不是一個快速解決方案。

0

如果您正在檢查的記錄數量真的很大,那麼您可以通過批量傳輸一次一個地分攤運輸成本:創建一個臨時表,對其進行大量插入您從緩存中取出的行,然後加入臨時表對原始表。你的數據庫管理系統將爲你做循環。

0

如果緩存中的結果包含您感興趣的記錄的主鍵,那麼您可以通過從數據庫中選擇這些鍵並查看返回的內容,輕鬆過濾結果。然後,只需發佈​​陳舊的記錄,你就可以走了。

results_from_cache = $redis.get("users") 

cached_user_ids = results_from_cache.map(&:id) 
actual_user_ids = User.where(id: user_ids).pluck(:id) 

results_minus_stale = results_from_cache.select do |user| 
    actual_user_ids.include?(user.id) 
end 
相關問題