hap
V2EX  ›  问与答

如何用更好的方式实现 web 缓存的更新?

  •  
  •   hap · Apr 16, 2017 · 2419 views
    This topic created in 3325 days ago, the information mentioned may be changed or developed.

    假如分别对如下方法进行了缓存:

    • get_article_ids() // 获取文章id集合

    • get_user_artical_ids() // 获取用户文章id集合

    此时,如果再实现一个 delete_article(aid) 方法,用于删掉一篇 article , 则需要在该方法内去删掉或更新上述两个方法的缓存,否则数据就不一致了。

    我的问题是:

    假如此时还需要实现一个 get_favorite_article_ids() 方法, 就需要在 delete_article 里再删除一个缓存,我觉得这样很不合理,也违背了 OCP 原则。 假如实现get_favorite_article_ids的这个人,遗漏了修改 delete_article 方法,数据则出错了。

    请问大家有什么更合理的方式来实现类似情况的缓存更新吗? 谢谢。

    8 replies    2017-04-17 12:52:58 +08:00
    hap
        1
    hap  
    OP
       Apr 16, 2017
    注:我已查了不少 Cache 的资料,但都查不到类似的一些方法。 有了解的人也可以扔点关键词给我,谢谢。
    hcymk2
        2
    hcymk2  
       Apr 17, 2017
    在这个场景下 id 集合缓存意义在哪里?
    hap
        3
    hap  
    OP
       Apr 17, 2017
    @hcymk2

    对 id 列表进行缓存,同时也会对 id 对应的 object 进行缓存。
    delete 、 update 操作肯定是远于 get 操作的。 这样的缓存肯定是有必要的。

    上述只是举一个例子用来说明类似的情况。
    hap
        4
    hap  
    OP
       Apr 17, 2017
    上面少了一个字: `delete 、 update 操作肯定是远少于 get 操作的。 `
    hcymk2
        5
    hcymk2  
       Apr 17, 2017
    一个 ID 是可以这样说,多了你就会发现你的那个集合缓存命中率会很不好看。
    明明是个缓存,非得当数据库用。
    jarlyyn
        6
    jarlyyn  
       Apr 17, 2017
    频率低就 flush 整个 cache,一了百了……
    hap
        7
    hap  
    OP
       Apr 17, 2017 via iPad
    @hcymk2 我说的是缓存整个列表,并不是缓存一个对象。
    例如我们在 V2EX 中看到的,目前问与答的列表,交易的列表,在有新的帖子发布之前,这些缓存的会命中率怎么会低呢? 这些都需要缓存起来,而不是每次都去数据库查。
    hap
        8
    hap  
    OP
       Apr 17, 2017 via iPad
    @jarlyyn flush 不是这个问题的原意了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   838 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 21:07 · PVG 05:07 · LAX 14:07 · JFK 17:07
    ♥ Do have faith in what you're doing.