请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

redis和mysql的一致性

请问老师本项目中是否有涉及到关于redis和mysql的一致性问题相关呀?目前这个项目我还没看完,还在继续看。
因为我看一致性问题是面试当中的一个重点高频问题,看章节目录好像没有提到,所以想问一下。

正在回答 回答被采纳积分+3

1回答

甲蛙 2023-06-19 11:24:06

mysql和redis的一致性,一般都是弱一致性,就是某个时间段,数据会不一致,但最终是一致的,比如余票查询,用户查的时候,列表从缓存里读,显示余票为1,但实际数据库可能是0了,但经过定时刷新缓存,最终缓存里也会变为0。

强一致性的话,几乎没法做,不适用,会有几个问题:

  1. 每次有人买票,都要同时修改数据库和缓存,对于高并发抢票,就会去频繁的修改缓存,这就失去了缓存的意义,缓存应该是读多写少。

  2. 比如缓存更新失败了,难道就不让用了?功能设计上,肯定是把缓存当成功能加强,而不是功能必须。缓存失败时,我们还是要能通过数据库来取数据,只不过为了防止并发过大,数据库撑不住,我们要加其它技术方案,比如限流、令牌、加锁等。

  3. 一次购票中,我们想同时更新缓存和数据库,但没法做到同时,他们又不能加事务,总是有先后的,所以依然有可能出现用户查到的缓存数据和数据库不一致的情况。

所以,一般我们的用法就是弱一致性:数据读缓存,然后定期更新或条件更新缓存

3 回复 有任何疑惑可以回复我~
  • 提问者 c9870884 #1
    老师,对于您说的采用弱一致性这一块我目前已经理解了,还有一个问题就是:
    我在学习一致性这块的内容时,了解到有几种方法:
    方案一:先更新数据库,再更新缓存,或,先更新缓存在更新数据库
    方案二:先删除缓存,再更新数据库,或,先更新数据库再删除缓存  
    方案三:CANAL+MQ实现最终一致性
    等等这些方案。
    这些方案都有各自的一些特点,我在学习的时候是比较笼统的学习的,没有一些具体的场景。
    想请问比如说在咱们这个12306具体项目中,一般是选择哪种方案呢,怎么考虑的呀
    回复 有任何疑惑可以回复我~ 2023-06-19 12:57:41
  • 甲蛙 回复 提问者 c9870884 #2
    实际中我都没用过这些方案,因为这些方案都不能保证实时一致,不管先操作数据库,还是先操作缓存,都会有先后,总会有不一致的情况。
    我都是采用的操作时,只操作数据库,然后通过加定时任务的方式,定时的将数据库的数据同步到缓存里。
    最近端午,我刚好在12306官网抢了次票,实际体验了下,明明显示还有一张票,我下单的时候却告诉我没有了,我回到列表,还是显示1张,直到5分钟左右后,再刷,才显示没票。所以12306他也不是实时去修改缓存的,而是定时的更新缓存。
    回复 有任何疑惑可以回复我~ 2023-06-23 11:37:12
  • 提问者 c9870884 回复 甲蛙 #3
    好的谢谢
    回复 有任何疑惑可以回复我~ 2023-06-25 10:41:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信