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