看板 Soft_Job 關於我們 聯絡資訊
大家好 小弟是軟工菜鳥 目前有個專案的需求是,會在一段程式邏輯中 對資料庫進行多次讀取或寫入,中間牽涉到兩張表以上 因為需要每秒執行這段邏輯至少2次,怕用mysql會影響效能,於是考慮用Redis來做 但有查到Redis執行命令,即使用multi exec也並非原子性 所以假設現在Redis有5行寫入要執行,但是執行到一半伺服器掛掉 會不會導致資料只寫了一半的數據錯誤問題呢? 那這樣的業務情況就表示不適合用Redis了是嗎? 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.141.18.126 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1690859355.A.382.html
integritywei: lua script?08/01 11:25
quickbym1: 很在意資料的正確性就還是應該用 RDBMS 才對,MySQL08/01 11:27
quickbym1: 沒那麼廢啦!有做讀寫分離嗎?08/01 11:27
abccbaandy: multi exec不就行了? 你從哪查到非原子性?08/01 11:28
kyoe: try catch?掛掉 rollback?08/01 11:31
ddoll288: 雖然伺服器掛掉不是你的問題,但是你要有備案處理08/01 11:58
underwater: redis cluster瞭解一下,並且memory db本來就沒保證08/01 12:32
ooooooo: 感覺你要的不是Redis而是queuing system 像是rabbit mq08/01 13:31
ooooooo: 或是Kafka 之類的08/01 13:31
alpe: 上千TPS再來擔心吧08/01 13:40
brucetu: 你的操作具體是什麼內容,系統設計沒有明確規格就沒辦法08/01 13:45
brucetu: 給你正確的解法,每一種場景都有他的tradeoff08/01 13:45
brucetu: 除非你的操作是mysql server memory cache裝不下的資料,08/01 13:47
brucetu: 一定牽涉到實體硬碟讀取加上每秒兩次不間斷而且否則你都08/01 13:47
brucetu: 是想太多直接mysql做就好了08/01 13:47
brucetu: 真的要計較得話即使是RMDBS都有可能在crash的時候資料沒08/01 13:51
brucetu: 有完整寫入硬碟導致你必須手動修復08/01 13:51
brucetu: 原子性是存在邏輯層的,在實體世界,任何硬體操作都有可08/01 13:52
brucetu: 能因為硬體失敗失去原子性08/01 13:52
brucetu: 如果你不考慮硬體失敗,那麼直接用redis persistence to08/01 13:53
brucetu: disk沒有任何問題08/01 13:53
brucetu: 因為RMDBS也是幫你塞了一層memory cache在硬碟寫入之前,08/01 13:54
brucetu: 寫入之前就當機一樣會出問題08/01 13:54
worf: rdbms有那麼弱嗎08/01 13:56
brucetu: 你真的要求資料絕對的完整性那就是用queue把一個操作紀08/01 13:56
brucetu: 錄到任何一種載體最簡單就是DB,然後另一支程式根據queue08/01 13:56
brucetu: 把一些資料寫到你需要的其他地方,再標示queue中的這個ta08/01 13:56
brucetu: sk已經被正確的寫入到其他位置08/01 13:56
brucetu: 然後你可能跟同事或owner討論完就發現你的場景根本不需要08/01 13:57
brucetu: 這麼嚴謹,量也沒那麼大,直接mysql一秒跑兩次就結案了,08/01 13:57
brucetu: 也假設server hardware error不會好死不死造成data corru08/01 13:57
brucetu: ption08/01 13:57
holebro: 你是yangog4ever的分身嗎08/01 14:03
不是喔
ddoll288: 一般AP/DB同一台應該不需要考慮這個問題,過度設計了08/01 15:20
netburst: queue+108/01 16:45
qss05: 哪那麼爛,之前公司要取資料,一次就取一千萬筆,每五百筆08/01 17:01
qss05: commit一次也沒當08/01 17:01
newking761: 我懷疑你本身有問題08/01 17:52
weinine32: 每張表的資料多少?索引怎麼設?能不能分庫分表?預算08/01 18:15
weinine32: 多少?08/01 18:15
weinine32: 即時性? 為什麼每秒兩次?能不能用前端減少查詢量?08/01 18:20
weinine32: 硬體規格? 壓力測試報告?08/01 18:45
weinine32: 不講業務和環境,談任何技術都是耍流氓08/01 18:56
drajan: 一秒兩次 用MySQL沒問題,做讀寫分離就好,寫入包在一個 t08/01 19:12
drajan: ransaction裡面08/01 19:12
lovdkkkk: redis 可以做 lock08/01 19:13
lovdkkkk: https://0rz.tw/at3R108/01 19:14
s06yji3: 每秒2次的頻率為啥會擔心MySQL影響效能?08/01 19:30
w0005151: RDBMS很強啦,基本schema有做好,讀寫node分離,再不行08/01 19:49
w0005151: 切table partition,可以應付90%以上的場景08/01 19:49
w0005151: 一個table幾百萬條record都不會是問題08/01 19:50
hegemon: 一個table 幾十億都看過...08/01 20:13
f12sd2e2aa: 每秒兩次…08/01 20:57
謝謝各位前輩回覆!會去找相關資料來看,目前還是選擇用一般關聯式資料庫來做 ※ 編輯: yangog (36.235.184.182 臺灣), 08/01/2023 22:19:02
superpandal: ........... 08/01 23:35
Serisu: TPS 2 應該不用想那麼多吧... 08/02 01:14
internetms52: 讀取跟寫入要分開討論,寫入有交易問題 08/02 07:42
internetms52: 先確認是否允許dirty read 08/02 07:44