Database 如果数据不断变化,你会缓存什么?(以Twitter为例)

Database 如果数据不断变化,你会缓存什么?(以Twitter为例),database,caching,memcached,redis,Database,Caching,Memcached,Redis,我花了一些时间研究缓存(主要是redis和memcached),在数据不断变化的情况下,我很难弄清楚到底在哪里使用缓存 以Twitter为例(只需阅读)。当他们的数据库记录中有很大一部分在不断变化时,您(或他们)如何缓存他们的数据 假设Twitter有以下几种模式:User,Tweet,Follow,Favorite 有人可能发布一条推特,一天转发一次,另一条推特一天转发一千次。对于1000倍的转发,因为每天大约有24*60==1440分钟,这意味着推特几乎每分钟更新一次(比如说它也有440个收

我花了一些时间研究缓存(主要是redis和memcached),在数据不断变化的情况下,我很难弄清楚到底在哪里使用缓存

以Twitter为例(只需阅读)。当他们的数据库记录中有很大一部分在不断变化时,您(或他们)如何缓存他们的数据

假设Twitter有以下几种模式:
User
Tweet
Follow
Favorite

有人可能发布一条推特,一天转发一次,另一条推特一天转发一千次。对于1000倍的转发,因为每天大约有
24*60==1440
分钟,这意味着推特几乎每分钟更新一次(比如说它也有440个收藏夹)。和跟踪某人一样,查理·辛甚至吸引了很多人。在这些情况下,缓存似乎不值得,但可能只是因为我还没有达到那个级别

还可以说,平均推特关注者每天至少一次推特/关注/收藏夹。这意味着在naive intro rails模式中,用户表至少每天更新一次(
tweet\u count
,等等)。这种情况对于缓存用户配置文件很有意义

但是对于上面的1000条tweet和100万关注者示例,在缓存数据时,推荐的做法是什么

具体来说(假设memcached或redis,并使用纯JSON API(无页面/片段缓存)):

  • 你是否缓存个人推文/记录
  • 或者您是否通过分页来缓存记录块(例如,每个记录块的redis列表
    20
  • 或者,您是否将这两个记录分别缓存在页面中(查看单个tweet而不是JSON提要)
  • 或者,您是否为每个不同场景缓存推文列表:主时间线推文、用户推文、用户喜爱的推文等?还是以上所有的
  • 或者您是否将数据分为“最不稳定(最新)”到“最近几天”到“旧”数据块,在这些数据块中,“旧”数据以更长的过期日期缓存,或者分为离散的分页列表或其他内容?而最新的记录根本就不会被缓存。(也就是说,如果数据像推特一样依赖于时间,那么如果您的旧记录知道它不会有太大变化,您是否会以不同的方式对待它?)
我不明白的是,数据更改量与是否应该缓存数据(以及处理缓存过期的复杂性)的比率是多少。Twitter似乎可以缓存不同的用户推文提要,以及每个用户的家庭推文,但是每次一条收藏夹/推文/转发推文都会使缓存失效,这意味着更新所有这些缓存项(以及可能缓存的记录列表),这在某种程度上似乎意味着使缓存无效会适得其反


对于变化如此之大的数据,建议采用哪些缓存策略?

我的谦逊2美分:Redis允许您对其数据结构进行操作,这意味着您可以比每次触摸关系数据库更快地执行内存操作

因此,可以更改“缓存”,使其不会像您期望的那样失效


在我的项目中,我定期将500K条记录加载到排序集,然后仅通过对它们进行范围查询来运行统计报告,这使报告的平均执行时间不到2秒。

并不是说Twitter就是这样做的(尽管我很确定它是相关的),但是:我最近认识了CQR+事件来源。( + ) .

基本上:读和写在应用程序以及持久性级别(CQR)上是完全分开的,对系统的每次写入都作为一个可以订阅的事件处理(事件源)。还有更多(比如能够重播整个事件流,这对于以后实现新功能非常有用),但这是相关的部分

在此之后,一般做法是,只要负责的
投影仪
(即:将事件投影到新的读取模型)接收到订阅的事件类型的新事件,就会重新创建
读取模型
(在mem缓存中思考)

在这种情况下,一个事件可以通过TweetHandle进行处理,该事件将由所有订阅者进行处理,其中一个
RecentTweetsPerUserProjector
TimelinePerUserProjector
等将更新其各自的ReadModel

结果是最终一致且不需要任何无效的ReadModels集合,即:更新的写入和结果事件是更新ReadModels的触发器

我同意Charlie Sheen的读取模型最终会得到大量更新(尽管这种更新可能非常有效),因此缓存优势可能非常低。然而,看看平均用户每时间单位的平均发帖量,情况就完全不同了

DDD/CQRS/活动采购领域的一些有影响力的人:Greg Young,Udi Dahan

这些概念相当“深刻”,所以不要指望在一个小时内就能完全理解(至少我没有)。也许最近关于相关概念的思维导图也很有用:


是的,如果你还没有注意到的话,我对此非常感兴趣:)

一些帮助:不,这听起来像是一些好东西。你刚才说的话让我产生了很多想法,谢谢你,先生!事实上,它对人们有这样的影响:)。。很高兴这有帮助!