redis中缓存一般存在三种更新策略;内存淘汰;超时剔除;主动更新。它们照片那个各有优缺点。
其中主动更新最为复杂。它又有三种策略;
Cache Aside ;同时更新缓存和数据库;
Read/Write Through;先更新缓存;缓存负责同步更新数据库;
Write Behind Caching;先更新缓存;缓存定时异步更新数据库。这三种模式各有优劣;可以根据业务场景选择使用。
第一种是通过调用者手动添加代码调用;第二种只需调用;其内部自动完成更新维护;但是成本较高。第三种只操作缓存;由其他线程异步更新缓存;效率较高。但是成本高;难以保证缓存的一致性。基于上述原因;常见使用的方案是第一种;Cache Aside Pattern;。
操作缓存数据库是有三种问题需要考虑
对于缓存和数据库先操作哪个的问题;由于线程问题。
若先删除缓存;再更新数据库。当一个线程删除了缓存;还未更新数据库时;有另一个线程进来访问缓存发现不存在;此时去数据库进行查询;而数据库还未及时更新;所以查询的数据是旧数据。就发生了数据缓存不一致的问题;出现脏读现象。
若先更新数据库;再删除缓存。缓存刚好到期失效时;读请求从数据库中读取数据;写请求更新完数据后再失效缓存后;读请求将旧数据存入到缓存中;这种情况也会导致脏数据的问题。实际上这种情况发生的概率很低;要发生这种情况的前提条件是写数据库要先于读数据库完成;一般而言读数据库相比于写数据库要耗时更短;这种前提条件成立的概率很低。且针对这种情况;一般可以采用异步双删策略以及过期失效的方式来避免。
所以在实际开发中;一般选择先更新数据库;再删除缓存的策略。
总结;