一、读数据过程
读数据的过程
- 从cache中读取数据
- 如果cache中有数据,直接返回;如果cache中没有数据,从db读数据,再把数据写回cache
二、写数据过程
方案1 先清除缓存,再写db
如果当前有两个一个读操作a,一个写操作b。在b清除缓存后,a读缓存失效,读db时,b还没有更新db,a会把旧数据写回缓存,此时就会造成缓存和db数据不一致。
方案2 先写db,再写缓存
如果有多个并发更新操作,也会造成缓存和数据库不一致。但如果你能保证对同一条记录的这种并发写的概率非常小,这种方案是可以的。比如sns游戏,玩家操作的一般都是自己的数据,对玩家自己某条数据的更新,同时一般只有一个请求。而对于游戏来说,频繁读取一个玩家同一条记录的情况非常频繁,写回缓存会保证每次读取都命中缓存,从而保证请求的响应速度非常快,因此游戏是比较适合这种方式的。
方案3 先写db,再清除缓存
这种情况能有效的避免方案2的问题,同时两个一读一写的操作造成不一致的概率要比方案1也小很多,对于一些web业务来讲,这是一个最合适的方案。
三、失败处理,即操作数据库成功后操作缓存失败
这种情况也会造成数据不一致,有两种解决方法
- 对缓存设置过期时间,缓存过期后,下次读操作会把db数据写回,如果业务能接受短暂的不一致,那么这是一个最简单高效的方案
- 对于失败的缓存操作,写入消息队列,由另外一个程序来消费,不断重试,来保证最终的一致性
网友评论