[討論] 存取即時資料用檔案 or 資料庫,哪個好?

作者: freeman371 (自由人371)   2021-02-26 21:46:17
假設:
我有一個即時通訊網站(聊天室程式)
其中程式裡頭有一部分需要記錄多位使用者現在的即時狀態
目前我的做法是用檔案的方式來存取這些狀態值
也許隨便取個檔名像是「temp_PHPSESSID_mklr2qbq3k1l6ajiqlh76f8qm4」這樣的暫存紀錄檔
裡頭內容可能就是一些簡單的值,例如「2,3,0,0,0」這類的,而「0」、「2」、「3」就是使用者的某些狀態代表值
這些temp檔案隨時都會被頻繁更動
而且於多名使用者同時上線時,這些人將同時存取同一檔案
雖然用「檔案I/O」來實現記錄使用者即時狀態很直觀、而且程式也好寫
但是聽說「若有多人同時操作及更動檔案時,檔案更動後的資料很可能會不如預期」
(亦即,同一檔案是不能由多人同時間存取的)
而且比起資料庫存取,檔案存取的效率較差、速度也較慢
也沒辦法像Database一樣可以靈活的操縱資料
然而,也聽說 Database的底層仍是以檔案模式存取 & 操作
只是在資料的處理算法上做了許多最佳化,處理資料的速度也比直接手刻程式處裡File裡的資料還來得快
那麼,為了怕上述的問題發生
我在猶豫是否應該把現在所有跟記錄即時狀態值有關的存取方式 從「檔案」全部改成用「資料庫」來存取?
不過這些即時狀態資料頂多也只是幾個零星簡單的數值而已
有時我也在想:
真的有必要為了加快「理論上」記錄、修改及存取的速度,以及提升存取效能
就要動用到資料庫來存取這些小值嗎?
比起檔案存取,感覺用像是mysqli之類的函數頻繁地存取這些小而簡易的狀態值有如「用大砲打小鳥」
似乎沒什麼必要,而且感覺效能也不會有所變好(甚至可能變得更差也說不定…)
因為資料庫的根本不也是用檔案來存取資料的嗎?
那為什麼就不乾脆用檔案存取就好了?
用資料庫就真的有比較快、比較有效率嗎?
所以各位對於「存取這種小量簡單但可能會有多人同時存取相同即時狀態值應該用什麼方式存取」有什麼看法?
除了用File、Database外,還有其他更好的存取方式嗎?
我目前全是用像file_get_contents、file_exists、file_put_contents、fopen等類的函數來操作使用者即時狀態值的檔案
要全改成另一種方式,光改寫程式大概就是個大工程了吧…
作者: p2k (pank)   2021-02-26 23:14:00
redis
作者: wayway2004 (暐暐)   2021-02-27 00:30:00
redis or memcache
作者: MOONRAKER (㊣牛鶴鰻毛人)   2021-02-27 00:49:00
你想太多了 think too much
作者: ddoll288 (風兒卿卿)   2021-02-27 03:00:00
恭喜你重新造了一個資料庫的輪子,有考慮file lock問題?用資料庫或queue會不會讓人生更美好?
作者: imhaha (嘿嘿)   2021-03-03 21:52:00
資料庫的存在不就是用來資料處理
作者: pandajohn (貓熊醬)   2021-03-17 03:56:00
資料庫也算大砲?

Links booklink

Contact Us: admin [ a t ] ucptt.com