作者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/cn.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