簡體   English   中英

在Rails應用程序上與所有用戶共享大型陣列

[英]Sharing an large array with all users on a rails app

我繼承了一個應用程序,該應用程序會為訪問該應用程序的每個用戶生成一個大型數組。 我最近發現幾乎所有用戶都一樣!!

現在,我想以某種方式對其進行復制,這樣就不會一遍又一遍地構建它。 我考慮了一些選項,並希望輸入以查看哪個選項最好:

1)創建一個模型並將數據推送到數據庫中。2)創建一個YAML文件,並在初始化時由應用加載。

我個人喜歡模型的想法,但是一些工作的工程師認為它不應該成為完整的模型。 97%的時間用戶將看到相同的東西,但3%的時間用戶將獲得略有不同的數組(一些元素已更改)。
我應該考慮的任何其他方法。

請記住,如果將數據存儲在數據庫中,則每個需要數據的請求都必須執行數據庫查詢才能將其提取。 如果運行多個服務器線程,則每個線程可以在內存中擁有自己的副本(如果它們都處理需要使用數組的請求)。 在這種情況下,您將不會節省任何內存(盡管您可以節省不必重新生成陣列的時間)。

如果您正在運行多個服務器進程(而不是線程),並且數組內容在應用程序運行時發生了變化,並且更改必須對所有進程可見,則無法在內存中進行緩存。 在這種情況下,您將不得不使用數據庫。

根據您評論中的信息,建議您嘗試如下操作:

將數組存儲在數據庫中,並確保使用的記錄已創建/更新了時間戳。 使用常量/全局變量/類變量將內容緩存在內存中。 還存儲上次更新緩存的時間。

每次需要使用數組時,請從數據庫中獲取相關的“更新”時間戳。 (您可能需要使用手工編碼的SQL和ModelName.connection.execute來避免拉回記錄中的所有數據,ActiveRecord可能會這樣做。)如果時間戳記晚於上次更新緩存的時間,請拉回數據庫中的數組並更新您的緩存。

檢索/更新緩存的數據時,請使用Mutex( 'require thread' ),以防服務器設置可能使用多個線程。 (我不認為Passenger會這樣做,但是在使用Passenger + RMagick時,我遇到了類似於線程問題的問題,因此為了安全起見,我仍然會使用互斥體。)

將處理緩存數組的所有代碼包裝在庫類(或用於存儲數據的模型上的類方法)中,因此緩存管理的詳細信息不會溢出到應用程序的其余部分。

使用Benchmark.measure {}對緩存設置進行一些性能測試。 如果設置中的錯誤實際上使性能變差而不是變好,那將是可悲的...

我會選擇選項2。可以在應用初始化時添加兩個從YAML文件加載的常量(分別為97%和3%)。 那應該大大減少您的內存占用。

話雖如此,是的,這只是對黑客的創可貼,但您已經知道了。 如果您願意的話,我會考慮花一些時間進行重新設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM