使用redis+MQ实现点赞操作|青训营笔记

316 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第二篇笔记

前面提到了如何使用redis缓存实现点赞操作,但是还存在着一个问题,redis是有可能丢数据的!

哪怕是使用了redis集群,一旦出现意外,数据也是说丢就丢。

那怎么办呢?这些数据可都不是能丢的啊

针对这个问题,我们小组进行了讨论,提出了两个解决方法

一、redis即使会丢数据,也只是丢最后一两秒的数据而已,我们可以在内存或者另外一个redis里缓存最后几秒的数据,并在双方维护一个同步变量,这样,即使出现了意外丢失数据,也可以从另一个缓存中将数据读取。

二、既然redis不可靠,那就不当做数据存储,仅仅只是一用它加快存取而已,我们在接口处,将数据写入redis的同时,再丢一份数据给MQ,让消费者去处理这些数据。

方案一中,我们非常‘乐观’的认为redis还是比较可靠的,只需要再做一小部分缓存应付突发情况即可。

方案二中,我们比较‘悲观’,redis可能时不时突然就奔溃了,未处理的数据最好在其它地方有完整的备份并处理

最后我们还是选择了使用方案二,从安全性上讲,无疑是方案二占优,既然redis不靠谱,那就让靠谱的MQ来。除此之外,相比于方案一,方案二的实现无疑是更加简单的。

当然,方案二也并不是没有缺点:

1、 假如用户一次性点了8次点赞,最终结果是没有变化的,但是mq并不能识别出来,还是会对mysql操作8次,尽管最后结果没变。

2、 redis中缓存的数据必须有足够长的缓存时间,否则可能出现mq里的信息未被消费,而redis缓存过期,这时候用户查询走mysql查出来的数据就有了偏差。