相信很多小伙伴面对缓存和数据库的数据不一致时都是使用的定时任务来解决吧,这中方式虽然简单,但是却有很大的问题,如果任务间隔太长非常容易出现数据不一致。所以对于业务体量小,且对数据一致性要求不高的任务可以使用定时任务。
如果业务体量很大,那么缓存和数据库一致主要有两种方式:
- 先删除缓存,再更新数据库
- 先更新数据库,再删除缓存
对于方式一:如果是高并发场景,当线程a要更新数据时,a先删除缓存,此时线程b读缓存,发现数据不存在便从数据库中读取旧值,而a将新值写入数据库,但b却将旧值写入缓存,此时发生数据不一致。
对于方式二:同样在并发场景,线程a查询某值,发现缓存中不存在,于是从数据库中读取值,此时线程b更新数据库并且删除缓存,而a却将旧值写入缓存,造成数据不一致。当然,这种情况极少见,因为一般写数据库比都数据库时间长,所以这种方式基本能保证缓存与数据库一致。
网上看了很多先更后删导致的不一致问题的解决方案,很多人都使用消息队列。
原理:更新数据库成功后,向消息队列发消息,消费者接收到消息执行删除缓存操作,借助消息队列的重试机制,以保证数据一致。但是,我觉得这个方案还是有些问题:
使用消息队列,增加了代码复杂度
如何保证消息的可靠性?