Language agnostic 当99.9%的数据频繁更改时,要缓存什么?

Language agnostic 当99.9%的数据频繁更改时,要缓存什么?,language-agnostic,caching,Language Agnostic,Caching,好吧,我知道我以前问过这个问题,答案基本上是缓存不经常更改的数据 那么,当至少99.9%的数据发生变化时,我们该怎么办 在我的项目中,唯一没有更新或不会经常更新的表是成员配置文件信息(名称/地址和设置) 那么,人们如何仍然启用某种缓存,但在应用更改时保持并确保正在查看的数据得到更新呢?我想,实际上并不是99.9%的数据发生了更改,而是99.9%的数据位置发生了更改 例如,如果你正在运行一个公告板,这意味着会有源源不断的新帖子,但旧帖子会保持不变,甚至旧帖子也会在很长一段时间内保持不变 在这种情况

好吧,我知道我以前问过这个问题,答案基本上是缓存不经常更改的数据

那么,当至少99.9%的数据发生变化时,我们该怎么办

在我的项目中,唯一没有更新或不会经常更新的表是成员配置文件信息(名称/地址和设置)


那么,人们如何仍然启用某种缓存,但在应用更改时保持并确保正在查看的数据得到更新呢?

我想,实际上并不是99.9%的数据发生了更改,而是99.9%的数据位置发生了更改

例如,如果你正在运行一个公告板,这意味着会有源源不断的新帖子,但旧帖子会保持不变,甚至旧帖子也会在很长一段时间内保持不变


在这种情况下,您将需要一种使旧缓存数据无效的方法,以便在查看线程(在本例中)后立即构建缓存。如果其中一个线程发生了更改(即,当有人添加新帖子时),该缓存项将被删除/标记为过时,因此下次查看时,将重新生成该缓存项。但是,其他仍然没有更改的项目将使用缓存。

如果每次查看数据时都会更改数据,这就破坏了缓存的意义-您应该寻找其他类型的优化


如果它每隔一段时间就改变一次,那么它可能仍然不值得缓存-不要忘记,在单实例web应用程序场景中,当对象发生变化时,以及在数据库中,可以手动更新缓存时,将某些内容存储到缓存会产生一些开销

偶尔可以刷新缓存以确保没有任何内容不同步(例如,如果数据库由其他应用程序更新)

请注意,这在企业规模的场景中不起作用。

视情况而定

如果你愿意做出牺牲(也就是说,事情变得非常糟糕,性能很好),你可能需要考虑缓存数据间隔很小(10秒,30秒,1分钟,…)以减少数据库上的负载。这些数据不会是最新的,但可能已经足够新鲜了


如果几乎没有任何负载,就没有必要开始摆弄缓存。真的,没有必要在不存在问题的地方发现问题。毕竟,许多数据库引擎都有自己的缓存,不仅用于数据,也用于执行计划。

真正相关的考虑因素是99.9%的信息多久会改变一次,是每一次访问、每一秒、每一分钟、每一小时吗?任何高于访问权限的内容都可能有意义,这取决于您拥有的每个时间单位的请求量和您选择的缓存方案

只要检索的平均时间减少,缓存就会停止您必须衡量这一点并做出决定


一些缓存验证技术是在访问时检查有效性,或者在缓存中存储时间戳和到期时间。每次访问时检查有效性的费用更高,时间戳+过期在某些情况下可能会导致过时的内容。

这非常适合缓存“随机”数据,比如在主页上显示随机头条新闻或随机广告。如果您有100个请求/秒,则将此信息缓存1-5秒是非常好和安全的,因此,在同一秒钟内,每个访问者都会得到相同的“随机”帖子/广告。