美文网首页缓存架构
Cache Aside Pattern的问题

Cache Aside Pattern的问题

作者: 小怪兽狂殴奥特曼 | 来源:发表于2018-11-01 11:54 被阅读2次

    Cache Aside Pattern

    常见的缓存更新模式有两种:Cache Aside Pattern 和 Read/Write Through Pattern.具体请参考这篇文章。缓存更新的套路
    Cache Aside Pattern的具体做法:

    1.PNG

    见上图,总结起来就是:
    读操作:先读缓存,读不到就取DB读,然后将读到的值写到缓存。
    写操作:直接写DB,然后再写缓存

    Cache Aside Pattern的问题

    在并发模型下,Cache Aside Pattern会存在以下问题:


    2.PNG

    线程A要执行一个读操作,操作分为两个过程:读DB和写缓存,分别对应途中的步骤1和步骤3.
    同时线程B要执行一个写操作,我们称之为步骤2.
    正常情况下,应该使读操作跟写操作是互斥的,即步骤1和步骤3执行完了后才能执行步骤2.
    假设数据库中有一个键K的值V,有两个并发的线程A和线程B。线程A需要执行读请求操作,线程B需要执行写请求操作。线程A执行完步骤1后,线程A拿到K的值为V(t),然后由于某种原因被挂起。接着线程B执行。线程B先更新DB中K的值为新的值V(t+1),然后带着新的值V(t+1)更新了缓存。然后结束操作。接着线程1继续执行步骤3更新缓存,于是K的值变成了V(t).结果导致DB中的值和缓存中的值不一致。之后的读操作请求到的一直是久的值V(t),直到新的写操作后缓存中的值才有可能更新。

    这种情况出现的概率非常低,但是在并发量很大情况下仍然有可能发生。

    解决方法

    既然是并发带来的问题,那么我们解决的思路就是:把并发操作给串行化。
    上面的问题产生的原因在于两个线程并发执行了写缓存的操作。我们可以通过将这两个写操作串行化来解决。
    以下是一个解决方法:


    3.PNG

    相关文章

      网友评论

        本文标题:Cache Aside Pattern的问题

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