美文网首页
数据库与缓存的一致性问题

数据库与缓存的一致性问题

作者: ShutLove | 来源:发表于2018-04-17 19:20 被阅读0次

    一、读数据过程

    读数据的过程

    1. 从cache中读取数据
    2. 如果cache中有数据,直接返回;如果cache中没有数据,从db读数据,再把数据写回cache

    二、写数据过程

    方案1 先清除缓存,再写db

    如果当前有两个一个读操作a,一个写操作b。在b清除缓存后,a读缓存失效,读db时,b还没有更新db,a会把旧数据写回缓存,此时就会造成缓存和db数据不一致。

    方案2 先写db,再写缓存

    如果有多个并发更新操作,也会造成缓存和数据库不一致。但如果你能保证对同一条记录的这种并发写的概率非常小,这种方案是可以的。比如sns游戏,玩家操作的一般都是自己的数据,对玩家自己某条数据的更新,同时一般只有一个请求。而对于游戏来说,频繁读取一个玩家同一条记录的情况非常频繁,写回缓存会保证每次读取都命中缓存,从而保证请求的响应速度非常快,因此游戏是比较适合这种方式的。

    方案3 先写db,再清除缓存

    这种情况能有效的避免方案2的问题,同时两个一读一写的操作造成不一致的概率要比方案1也小很多,对于一些web业务来讲,这是一个最合适的方案。

    三、失败处理,即操作数据库成功后操作缓存失败

    这种情况也会造成数据不一致,有两种解决方法

    1. 对缓存设置过期时间,缓存过期后,下次读操作会把db数据写回,如果业务能接受短暂的不一致,那么这是一个最简单高效的方案
    2. 对于失败的缓存操作,写入消息队列,由另外一个程序来消费,不断重试,来保证最终的一致性

    相关文章

      网友评论

          本文标题:数据库与缓存的一致性问题

          本文链接:https://www.haomeiwen.com/subject/dnypkftx.html