采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
请问老师本项目中是否有涉及到关于redis和mysql的一致性问题相关呀?目前这个项目我还没看完,还在继续看。 因为我看一致性问题是面试当中的一个重点高频问题,看章节目录好像没有提到,所以想问一下。
mysql和redis的一致性,一般都是弱一致性,就是某个时间段,数据会不一致,但最终是一致的,比如余票查询,用户查的时候,列表从缓存里读,显示余票为1,但实际数据库可能是0了,但经过定时刷新缓存,最终缓存里也会变为0。
强一致性的话,几乎没法做,不适用,会有几个问题:
每次有人买票,都要同时修改数据库和缓存,对于高并发抢票,就会去频繁的修改缓存,这就失去了缓存的意义,缓存应该是读多写少。
比如缓存更新失败了,难道就不让用了?功能设计上,肯定是把缓存当成功能加强,而不是功能必须。缓存失败时,我们还是要能通过数据库来取数据,只不过为了防止并发过大,数据库撑不住,我们要加其它技术方案,比如限流、令牌、加锁等。
一次购票中,我们想同时更新缓存和数据库,但没法做到同时,他们又不能加事务,总是有先后的,所以依然有可能出现用户查到的缓存数据和数据库不一致的情况。
所以,一般我们的用法就是弱一致性:数据读缓存,然后定期更新或条件更新缓存
老师,对于您说的采用弱一致性这一块我目前已经理解了,还有一个问题就是: 我在学习一致性这块的内容时,了解到有几种方法: 方案一:先更新数据库,再更新缓存,或,先更新缓存在更新数据库 方案二:先删除缓存,再更新数据库,或,先更新数据库再删除缓存 方案三:CANAL+MQ实现最终一致性 等等这些方案。 这些方案都有各自的一些特点,我在学习的时候是比较笼统的学习的,没有一些具体的场景。 想请问比如说在咱们这个12306具体项目中,一般是选择哪种方案呢,怎么考虑的呀
实际中我都没用过这些方案,因为这些方案都不能保证实时一致,不管先操作数据库,还是先操作缓存,都会有先后,总会有不一致的情况。 我都是采用的操作时,只操作数据库,然后通过加定时任务的方式,定时的将数据库的数据同步到缓存里。 最近端午,我刚好在12306官网抢了次票,实际体验了下,明明显示还有一张票,我下单的时候却告诉我没有了,我回到列表,还是显示1张,直到5分钟左右后,再刷,才显示没票。所以12306他也不是实时去修改缓存的,而是定时的更新缓存。
好的谢谢
登录后可查看更多问答,登录/注册
最新版Spring3.0仿12306售票系统实战
1.1k 28
564 12
598 8
637 8
1.1k 7