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

2017-04-16 21:32:18 +08:00
 hap

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

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

我的问题是:

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

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

1605 次点击
所在节点    问与答
8 条回复
hap
2017-04-16 21:55:04 +08:00
注:我已查了不少 Cache 的资料,但都查不到类似的一些方法。 有了解的人也可以扔点关键词给我,谢谢。
hcymk2
2017-04-17 00:02:21 +08:00
在这个场景下 id 集合缓存意义在哪里?
hap
2017-04-17 00:07:36 +08:00
@hcymk2

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

上述只是举一个例子用来说明类似的情况。
hap
2017-04-17 00:08:27 +08:00
上面少了一个字: `delete 、 update 操作肯定是远少于 get 操作的。 `
hcymk2
2017-04-17 00:55:24 +08:00
一个 ID 是可以这样说,多了你就会发现你的那个集合缓存命中率会很不好看。
明明是个缓存,非得当数据库用。
jarlyyn
2017-04-17 00:59:37 +08:00
频率低就 flush 整个 cache,一了百了……
hap
2017-04-17 01:21:50 +08:00
@hcymk2 我说的是缓存整个列表,并不是缓存一个对象。
例如我们在 V2EX 中看到的,目前问与答的列表,交易的列表,在有新的帖子发布之前,这些缓存的会命中率怎么会低呢? 这些都需要缓存起来,而不是每次都去数据库查。
hap
2017-04-17 12:52:58 +08:00
@jarlyyn flush 不是这个问题的原意了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/355264

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX