一、面试题
如何保证缓存与数据库的双写一致性?
二、面试官心理剖析
你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要双写,就一定会有数据一致性的问题。那你如何解决一致性问题。
三、面试题剖析
一般来说,如果你的系统不是严格要求缓存+数据库必须一致性的话,允许缓存可以稍微的跟数据库偶尔有不一致的情况。最好不要做这个方案。读请求和写请求串行化,串到一个内存队列里。这样就可以保证一定不会出现不一致的情况。
四、Cache Aside Pattern
最经典的缓存+数据库的读写模式就是 Cache Aside Pattern。
1、读的时候,先读缓存,缓存没有的话,就读数据库。取出数据后放入缓存,同时返回相应。
2、更新的时候,先更新数据库,再删除缓存。
五、为什么是删除缓存而不是更新缓存
原因很简单,一些复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。比如更新了某个表的1个字段。然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最近的值。
另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于比较复杂的缓存数据计算的场景,就不是这样了。如果你频繁修改一个缓存涉及的多个表,缓存也频繁更新。但是问题在于,这个缓存到底会不会被频繁访问到?
举个栗子,一个缓存涉及的表的字段,在 1 分钟内就修改了 20 次,或者是 100 次