V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hap
V2EX  ›  问与答

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

  •  
  •   hap · 2017-04-16 21:32:18 +08:00 · 1699 次点击
    这是一个创建于 2769 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • 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 条回复    2017-04-17 12:52:58 +08:00
    hap
        1
    hap  
    OP
       2017-04-16 21:55:04 +08:00
    注:我已查了不少 Cache 的资料,但都查不到类似的一些方法。 有了解的人也可以扔点关键词给我,谢谢。
    hcymk2
        2
    hcymk2  
       2017-04-17 00:02:21 +08:00
    在这个场景下 id 集合缓存意义在哪里?
    hap
        3
    hap  
    OP
       2017-04-17 00:07:36 +08:00
    @hcymk2

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

    上述只是举一个例子用来说明类似的情况。
    hap
        4
    hap  
    OP
       2017-04-17 00:08:27 +08:00
    上面少了一个字: `delete 、 update 操作肯定是远少于 get 操作的。 `
    hcymk2
        5
    hcymk2  
       2017-04-17 00:55:24 +08:00
    一个 ID 是可以这样说,多了你就会发现你的那个集合缓存命中率会很不好看。
    明明是个缓存,非得当数据库用。
    jarlyyn
        6
    jarlyyn  
       2017-04-17 00:59:37 +08:00
    频率低就 flush 整个 cache,一了百了……
    hap
        7
    hap  
    OP
       2017-04-17 01:21:50 +08:00 via iPad
    @hcymk2 我说的是缓存整个列表,并不是缓存一个对象。
    例如我们在 V2EX 中看到的,目前问与答的列表,交易的列表,在有新的帖子发布之前,这些缓存的会命中率怎么会低呢? 这些都需要缓存起来,而不是每次都去数据库查。
    hap
        8
    hap  
    OP
       2017-04-17 12:52:58 +08:00 via iPad
    @jarlyyn flush 不是这个问题的原意了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:39 · PVG 17:39 · LAX 01:39 · JFK 04:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.