目前的开发环境:php7.2 | thinkphp
1.用mysql实现的架构:
生产者:大量数据先存入mysql中间表(mysql中间表用唯一索引约束唯一性)
多个消费者:循环从mysql中间表中取数据,进行计算后存入mysql结果表
2.用redis实现的架构:
生产者:大量数据先进入redis集合(为了保证重复数据不入队列),确定能进入集合的数据再塞入redis队列
多个生产者:循环从redis队列中取数据,每取一条数据后将该数据从redis集合中删除,对数据进行计算,计算后的数据存入mysql结果表
两种架构在实际使用中发现,用纯mysql的方式实现,结果数据很稳定,没有出现丢失的情况。
而用redis的方式实现,会发现存在数据丢失的情况(即结果表里缺少数据),而且还找不到数据丢失的原因,trycatch和redis日志均无问题。用redis集合加redis队列作为中间过度的方式为什么会不稳定?原因在哪里?
首先,Redis什么时候会出现
丢数据
?Redis持久化有两种方式
RDB
和AOF
,它只会在重启时可能丢失数据。正常运行的情况下,是不会丢失数据的。找不到丢失的原因?,为什么不稳定?
MySQL有ACID,强一致性事务支持。而Redis分步操作,每步都可能出问题。
而且还找不到数据丢失的原因
分步骤来看:
循环从redis队列中取数据,每取一条数据后将该数据从redis集合中删除,对数据进行计算,计算后的数据存入mysql结果表
这是一个很大的步骤。最简答的方法,加日志,看看是哪里丢的数据。比如取了数据从Redis删除了,计算时出现问题,没有写MySQL。
你抛出的问题,别人很难处理。没有代码不请求具体实现,而且你没有耐心的去找原因。每个步骤都加详细的日志,不可能存在找不到原因这种问题。