redis中缓存一般存在三种更新策略:内存淘汰,超时剔除,主动更新。它们照片那个各有优缺点。

 其中主动更新最为复杂。它又有三种策略:

 Cache Aside :同时更新缓存和数据库;

 Read/Write Through:先更新缓存,缓存负责同步更新数据库;

 Write Behind Caching:先更新缓存,缓存定时异步更新数据库。这三种模式各有优劣,可以根据业务场景选择使用。

        第一种是通过调用者手动添加代码调用,第二种只需调用,其内部自动完成更新维护,但是成本较高。第三种只操作缓存,由其他线程异步更新缓存,效率较高。但是成本高,难以保证缓存的一致性。基于上述原因,常见使用的方案是第一种(Cache Aside Pattern)。

       

         操作缓存数据库是有三种问题需要考虑

 对于缓存和数据库先操作哪个的问题,由于线程问题。

        若先删除缓存,再更新数据库。当一个线程删除了缓存,还未更新数据库时,有另一个线程进来访问缓存发现不存在,此时去数据库进行查询,而数据库还未及时更新,所以查询的数据是旧数据。就发生了数据缓存不一致的问题,出现脏读现象。 

        若先更新数据库,再删除缓存。缓存刚好到期失效时,读请求从数据库中读取数据,写请求更新完数据后再失效缓存后,读请求将旧数据存入到缓存中,这种情况也会导致脏数据的问题。实际上这种情况发生的概率很低,要发生这种情况的前提条件是写数据库要先于读数据库完成,一般而言读数据库相比于写数据库要耗时更短,这种前提条件成立的概率很低。且针对这种情况,一般可以采用异步双删策略以及过期失效的方式来避免。

所以在实际开发中,一般选择先更新数据库,再删除缓存的策略。

        总结:

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐