PTT推薦

[請益] Redis執行多行寫入問題

看板Soft_Job標題[請益] Redis執行多行寫入問題作者
yangog
(yangOG)
時間推噓 7 推:9 噓:2 →:46

大家好 小弟是軟工菜鳥

目前有個專案的需求是,會在一段程式邏輯中

對資料庫進行多次讀取或寫入,中間牽涉到兩張表以上

因為需要每秒執行這段邏輯至少2次,怕用mysql會影響效能,於是考慮用Redis來做

但有查到Redis執行命令,即使用multi exec也並非原子性

所以假設現在Redis有5行寫入要執行,但是執行到一半伺服器掛掉

會不會導致資料只寫了一半的數據錯誤問題呢?

那這樣的業務情況就表示不適合用Redis了是嗎?

謝謝!

--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.141.18.126 (臺灣)
PTT 網址

integritywei08/01 11:25lua script?

quickbym108/01 11:27很在意資料的正確性就還是應該用 RDBMS 才對,MySQL

quickbym108/01 11:27沒那麼廢啦!有做讀寫分離嗎?

abccbaandy08/01 11:28multi exec不就行了? 你從哪查到非原子性?

kyoe08/01 11:31try catch?掛掉 rollback?

ddoll28808/01 11:58雖然伺服器掛掉不是你的問題,但是你要有備案處理

underwater08/01 12:32redis cluster瞭解一下,並且memory db本來就沒保證

ooooooo08/01 13:31感覺你要的不是Redis而是queuing system 像是rabbit mq

ooooooo08/01 13:31 或是Kafka 之類的

alpe08/01 13:40上千TPS再來擔心吧

brucetu08/01 13:45你的操作具體是什麼內容,系統設計沒有明確規格就沒辦法

brucetu08/01 13:45給你正確的解法,每一種場景都有他的tradeoff

brucetu08/01 13:47除非你的操作是mysql server memory cache裝不下的資料,

brucetu08/01 13:47一定牽涉到實體硬碟讀取加上每秒兩次不間斷而且否則你都

brucetu08/01 13:47是想太多直接mysql做就好了

brucetu08/01 13:51真的要計較得話即使是RMDBS都有可能在crash的時候資料沒

brucetu08/01 13:51有完整寫入硬碟導致你必須手動修復

brucetu08/01 13:52原子性是存在邏輯層的,在實體世界,任何硬體操作都有可

brucetu08/01 13:52能因為硬體失敗失去原子性

brucetu08/01 13:53如果你不考慮硬體失敗,那麼直接用redis persistence to

brucetu08/01 13:53 disk沒有任何問題

brucetu08/01 13:54因為RMDBS也是幫你塞了一層memory cache在硬碟寫入之前,

brucetu08/01 13:54寫入之前就當機一樣會出問題

worf08/01 13:56rdbms有那麼弱嗎

brucetu08/01 13:56你真的要求資料絕對的完整性那就是用queue把一個操作紀

brucetu08/01 13:56錄到任何一種載體最簡單就是DB,然後另一支程式根據queue

brucetu08/01 13:56把一些資料寫到你需要的其他地方,再標示queue中的這個ta

brucetu08/01 13:56sk已經被正確的寫入到其他位置

brucetu08/01 13:57然後你可能跟同事或owner討論完就發現你的場景根本不需要

brucetu08/01 13:57這麼嚴謹,量也沒那麼大,直接mysql一秒跑兩次就結案了,

brucetu08/01 13:57也假設server hardware error不會好死不死造成data corru

brucetu08/01 13:57ption

holebro08/01 14:03你是yangog4ever的分身嗎

不是喔

ddoll28808/01 15:20一般AP/DB同一台應該不需要考慮這個問題,過度設計了

netburst08/01 16:45queue+1

qss0508/01 17:01哪那麼爛,之前公司要取資料,一次就取一千萬筆,每五百筆

qss0508/01 17:01commit一次也沒當

newking76108/01 17:52我懷疑你本身有問題

weinine3208/01 18:15每張表的資料多少?索引怎麼設?能不能分庫分表?預算

weinine3208/01 18:15多少?

weinine3208/01 18:20即時性? 為什麼每秒兩次?能不能用前端減少查詢量?

weinine3208/01 18:45硬體規格? 壓力測試報告?

weinine3208/01 18:56不講業務和環境,談任何技術都是耍流氓

drajan08/01 19:12一秒兩次 用MySQL沒問題,做讀寫分離就好,寫入包在一個 t

drajan08/01 19:12ransaction裡面

lovdkkkk08/01 19:13redis 可以做 lock

lovdkkkk08/01 19:14 https://0rz.tw/at3R1

s06yji308/01 19:30每秒2次的頻率為啥會擔心MySQL影響效能?

w000515108/01 19:49RDBMS很強啦,基本schema有做好,讀寫node分離,再不行

w000515108/01 19:49切table partition,可以應付90%以上的場景

w000515108/01 19:50一個table幾百萬條record都不會是問題

hegemon08/01 20:13一個table 幾十億都看過...

f12sd2e2aa08/01 20:57每秒兩次…

謝謝各位前輩回覆!會去找相關資料來看,目前還是選擇用一般關聯式資料庫來做

※ 編輯: yangog (36.235.184.182 臺灣), 08/01/2023 22:19:02

superpandal08/01 23:35...........

Serisu08/02 01:14TPS 2 應該不用想那麼多吧...

internetms5208/02 07:42讀取跟寫入要分開討論,寫入有交易問題

internetms5208/02 07:44先確認是否允許dirty read