为什么感觉redis队列不如mysql稳定,容易丢数据,原因何在?

目前的开发环境:php7.2 | thinkphp

1.用mysql实现的架构:
生产者:大量数据先存入mysql中间表(mysql中间表用唯一索引约束唯一性)
多个消费者:循环从mysql中间表中取数据,进行计算后存入mysql结果表

2.用redis实现的架构:
生产者:大量数据先进入redis集合(为了保证重复数据不入队列),确定能进入集合的数据再塞入redis队列
多个生产者:循环从redis队列中取数据,每取一条数据后将该数据从redis集合中删除,对数据进行计算,计算后的数据存入mysql结果表

两种架构在实际使用中发现,用纯mysql的方式实现,结果数据很稳定,没有出现丢失的情况。
而用redis的方式实现,会发现存在数据丢失的情况(即结果表里缺少数据),而且还找不到数据丢失的原因,trycatch和redis日志均无问题。用redis集合加redis队列作为中间过度的方式为什么会不稳定?原因在哪里?

阅读 2.9k
2 个回答

首先,Redis什么时候会出现丢数据

Redis持久化有两种方式RDBAOF,它只会在重启时可能丢失数据。正常运行的情况下,是不会丢失数据的。


找不到丢失的原因?,为什么不稳定?

MySQL有ACID,强一致性事务支持。而Redis分步操作,每步都可能出问题。

而且还找不到数据丢失的原因

分步骤来看:

  • 大量数据先进入redis集合? 是否正常
  • 再塞入redis队列? 是否正常

循环从redis队列中取数据,每取一条数据后将该数据从redis集合中删除,对数据进行计算,计算后的数据存入mysql结果表

这是一个很大的步骤。最简答的方法,加日志,看看是哪里丢的数据。比如取了数据从Redis删除了,计算时出现问题,没有写MySQL。


你抛出的问题,别人很难处理。没有代码不请求具体实现,而且你没有耐心的去找原因。每个步骤都加详细的日志,不可能存在找不到原因这种问题。

首先要了解为什么要用redis,如果你司业务量不大的话,直接走mysql这个方案倒是最优解。
那么业务量大的时候,这个时候磁盘IO就体现出缺点了,跟内存IO压根差了几个数量级。用redis是为了缓解瞬发大量的写入。
其次你说的丢数据,指的是redis服务挂了,然后持久化策略的局限,有些内存数据没来得及持久化到磁盘。正常情况下运行,只要代码没bug,不存在丢数据。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏