为什么感觉redis队列不如mysql稳定,容易丢数据,原因何在?
目前的开发环境: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队列? 是否正常
循环从redis队列中取数据,每取一条数据后将该数据从redis集合中删除,对数据进行计算,计算后的数据存入mysql结果表
这是一个很大的步骤。最简答的方法,加日志,看看是哪里丢的数据。比如取了数据从Redis删除了,计算时出现问题,没有写MySQL。
你抛出的问题,别人很难处理。没有代码不请求具体实现,而且你没有耐心的去找原因。每个步骤都加详细的日志,不可能存在找不到原因这种问题。
回答:
首先要了解为什么要用redis,如果你司业务量不大的话,直接走mysql这个方案倒是最优解。
那么业务量大的时候,这个时候磁盘IO就体现出缺点了,跟内存IO压根差了几个数量级。用redis是为了缓解瞬发大量的写入。
其次你说的丢数据,指的是redis服务挂了,然后持久化策略的局限,有些内存数据没来得及持久化到磁盘。正常情况下运行,只要代码没bug,不存在丢数据。
以上是 为什么感觉redis队列不如mysql稳定,容易丢数据,原因何在? 的全部内容, 来源链接: utcz.com/p/945002.html