美文网首页好好工作
25、如何保证缓存与数据库双写时的数据一致性?

25、如何保证缓存与数据库双写时的数据一致性?

作者: db41bbeed50c | 来源:发表于2018-12-28 18:14 被阅读46次

    1、面试题

    如何保证缓存与数据库的双写一致性?

    2、面试官心里分析

    你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?

    3、面试题剖析

    一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况。

    串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。

    一、Cache Aside Pattern缓存+数据库读写模式的分析

    最经典的缓存+数据库读写的模式,cache aside pattern

    1、Cache Aside Pattern

    (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应;

    (2)更新的时候,先删除缓存,然后再更新数据库。

    cache aside pattern.png

    2、为什么是删除缓存,而不是更新缓存呢?

    原因很简单,很多时候,复杂点的缓存的场景,因为缓存有的时候,不简单是数据库中直接取出来的值;

    商品详情页的系统,修改库存,只是修改了某个表的某些字段,但是要真正把这个影响的最终的库存计算出来,可能还需要从其他表查询一些数据,然后进行一些复杂的运算,才能最终计算出;

    现在最新的库存是多少,然后才能将库存更新到缓存中去;

    比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据,并进行运算,才能计算出缓存最新的值的;

    更新缓存的代价是很高的;

    是不是说,每次修改数据库的时候,都一定要将其对应的缓存去跟新一份?也许有的场景是这样的,但是对于比较复杂的缓存数据计算的场景,就不是这样了;

    如果你频繁修改一个缓存涉及的多个表,那么这个缓存会被频繁的更新,频繁的更新缓存;

    但是问题在于,这个缓存到底会不会被频繁访问到?

    举个例子,一个缓存涉及的表的字段,在1分钟内就修改了20次,或者是100次,那么缓存跟新20次,100次; 但是这个缓存在1分钟内就被读取了1次,有大量的冷数据,

    28法则,黄金法则,20%的数据,占用了80%的访问量,

    实际上,如果你只是删除缓存的话,那么1分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低,

    每次数据过来,就只是删除缓存,然后修改数据库,如果这个缓存,在1分钟内只是被访问了1次,那么只有那1次,缓存是要被重新计算的,用缓存才去算缓存,

    其实删除缓存,而不是更新缓存,就是一个lazy计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算,

    mybatis,hibernate,懒加载,思想

    查询一个部门,部门带了一个员工的list,没有必要说每次查询部门,都里面的1000个员工的数据也同时查出来啊

    80%的情况,查这个部门,就只是要访问这个部门的信息就可以了,

    先查部门,同时要访问里面的员工,那么这个时候只有在你要访问里面的员工的时候,才会去数据库里面查询1000个员工。

    文集:https://www.jianshu.com/nb/32293473

    相关文章

      网友评论

        本文标题:25、如何保证缓存与数据库双写时的数据一致性?

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