作者:
yangog (yangOG)
2023-08-01 11:09:13大家好 小弟是軟工菜鳥
目前有個專案的需求是,會在一段程式邏輯中
對資料庫進行多次讀取或寫入,中間牽涉到兩張表以上
因為需要每秒執行這段邏輯至少2次,怕用mysql會影響效能,於是考慮用Redis來做
但有查到Redis執行命令,即使用multi exec也並非原子性
所以假設現在Redis有5行寫入要執行,但是執行到一半伺服器掛掉
會不會導致資料只寫了一半的數據錯誤問題呢?
那這樣的業務情況就表示不適合用Redis了是嗎?
謝謝!
作者: quickbym1 (張探長) 2023-08-01 11:27:00
很在意資料的正確性就還是應該用 RDBMS 才對,MySQL沒那麼廢啦!有做讀寫分離嗎?
multi exec不就行了? 你從哪查到非原子性?
作者:
kyoe (緣份‧不再)
2023-08-01 11:31:00try catch?掛掉 rollback?
作者: underwater (underwater) 2023-08-01 12:32:00
redis cluster瞭解一下,並且memory db本來就沒保證
作者:
ooooooo (感覺銜接最重要...)
2023-08-01 13:31:00感覺你要的不是Redis而是queuing system 像是rabbit mq或是Kafka 之類的
作者:
alpe (薛丁格的貓)
2023-08-01 13:40:00上千TPS再來擔心吧
作者:
brucetu (sec)
2023-08-01 13:45:00你的操作具體是什麼內容,系統設計沒有明確規格就沒辦法給你正確的解法,每一種場景都有他的tradeoff除非你的操作是mysql server memory cache裝不下的資料,一定牽涉到實體硬碟讀取加上每秒兩次不間斷而且否則你都是想太多直接mysql做就好了真的要計較得話即使是RMDBS都有可能在crash的時候資料沒有完整寫入硬碟導致你必須手動修復原子性是存在邏輯層的,在實體世界,任何硬體操作都有可能因為硬體失敗失去原子性如果你不考慮硬體失敗,那麼直接用redis persistence todisk沒有任何問題因為RMDBS也是幫你塞了一層memory cache在硬碟寫入之前,寫入之前就當機一樣會出問題
作者: worf 2023-08-01 13:56:00
rdbms有那麼弱嗎
作者:
brucetu (sec)
2023-08-01 13:56:00你真的要求資料絕對的完整性那就是用queue把一個操作紀錄到任何一種載體最簡單就是DB,然後另一支程式根據queue把一些資料寫到你需要的其他地方,再標示queue中的這個task已經被正確的寫入到其他位置然後你可能跟同事或owner討論完就發現你的場景根本不需要這麼嚴謹,量也沒那麼大,直接mysql一秒跑兩次就結案了,也假設server hardware error不會好死不死造成data corruption
作者:
holebro (穴弟弟)
2023-08-01 14:03:00你是yangog4ever的分身嗎
一般AP/DB同一台應該不需要考慮這個問題,過度設計了
作者:
netburst (133 134 592)
2023-08-01 16:45:00queue+1
作者:
qss05 (minami)
2023-08-01 17:01:00哪那麼爛,之前公司要取資料,一次就取一千萬筆,每五百筆commit一次也沒當
作者: weinine32 (隨意) 2023-08-01 18:15:00
每張表的資料多少?索引怎麼設?能不能分庫分表?預算多少?即時性? 為什麼每秒兩次?能不能用前端減少查詢量?硬體規格? 壓力測試報告?不講業務和環境,談任何技術都是耍流氓
作者:
drajan (EasoN)
2023-08-01 19:12:00一秒兩次 用MySQL沒問題,做讀寫分離就好,寫入包在一個 transaction裡面
作者: s06yji3 (阿南) 2023-08-01 19:30:00
每秒2次的頻率為啥會擔心MySQL影響效能?
RDBMS很強啦,基本schema有做好,讀寫node分離,再不行切table partition,可以應付90%以上的場景一個table幾百萬條record都不會是問題
作者:
hegemon (hegemon)
2023-08-01 20:13:00一個table 幾十億都看過...
作者: superpandal 2023-08-01 23:35:00
...........
作者: Serisu (Serisu) 2023-08-02 01:14:00
TPS 2 應該不用想那麼多吧...
作者: internetms52 (Oaide) 2023-08-02 07:42:00
讀取跟寫入要分開討論,寫入有交易問題先確認是否允許dirty read