- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我花了一些时间研究缓存(主要是 redis 和 memcached),我很难弄清楚当数据不断变化时究竟在哪里使用缓存。
以 Twitter 为例(请阅读 Making Twitter 10000% faster)。当他们的大部分数据库记录不断变化时,您(或他们)将如何缓存他们的数据?
假设 Twitter 有这些模型:User
、Tweet
、Follow
、Favorite
。
有人可能会发布一条推文,一天被转发一次,而另一条推文一天被转发一千次。对于 1000 次转发,由于一天中有大约 24 * 60 == 1440
分钟,这意味着推文几乎每分钟更新一次(假设它也有 440 个收藏)。跟人一样,charlie sheen还被人吸引了1 million Twitter followers in 1 day .在这些情况下缓存似乎不值得,但也许只是因为我还没有达到那个水平。
还可以说,一般的 Twitter 关注者每天至少发推文/关注/收藏一次。这意味着在简单的 intro-rails 模式情况下,用户表每天至少更新一次(tweet_count
等)。这种情况对于缓存用户配置文件很有意义。
但对于上面的 1000 条推文和 100 万关注者示例,在缓存数据方面有哪些推荐做法?
具体来说(假设使用 memcached 或 redis,并使用纯 JSON API(无页面/片段缓存)):
20
的 Redis 列表)?我不明白的是,数据更改量与是否应该缓存它(并处理缓存过期的复杂性)的比率是多少。似乎 Twitter 可以缓存不同的用户推文提要,以及 每个用户 的主页推文,但是每次一个收藏夹/推文/转推都使缓存无效将意味着更新所有这些缓存项(和可能缓存的记录列表),在某些时候这似乎意味着使缓存无效会适得其反。
缓存像这样变化很大的数据的推荐策略是什么?
最佳答案
并不是说 Twitter 就是这样做的(虽然我很确定它是相关的),但是:我最近熟悉了 CQRS + Event Sourcing。 (http://martinfowler.com/bliki/CQRS.html + http://martinfowler.com/eaaDev/EventSourcing.html)。
基本上:读取和写入在应用程序和持久性级别 (CQRS) 上完全分离,并且对系统的每次写入都作为可以订阅的事件处理(事件源)。它还有更多内容(例如能够重放整个事件流,这对于以后实现新功能非常有用),但这是相关的部分。
在此之后,一般的做法是,每当负责的Projector
(即:它投影一个事件到一个新的读取模型)接收一个它订阅的事件类型的新事件。
在这种情况下,一个事件可以是 TweetHandled,它将由所有订阅者处理,其中有 RecentTweetsPerUserProjector
、TimelinePerUserProjector
等,以更新他们各自的 ReadModels。
结果是最终一致且不需要任何失效的 ReadModels 集合,即:更新的写入和产生的事件是开始更新 ReadModels 的触发器。
我同意最终,Charlie Sheen 的读取模型会得到大量更新(尽管这种更新可能非常有效),因此缓存优势可能非常低。然而,查看普通用户每个时间单位的平均发帖数,情况就完全不同了。
DDD/CQRS/事件溯源领域的一些有影响力的人:Greg Young、Udi Dahan。
这些概念非常“深刻”,所以不要指望在一小时内完全理解它(至少我没有)。也许最近关于相关概念的思维导图也很有用:http://www.mindmeister.com/de/181195534/cqrs-ddd-links
是的,我对此很感兴趣,如果你还没有注意到的话:)
关于database - 如果数据不断变化,你缓存什么? (以推特为例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11625822/
如果这不是一个错误,那就是另一个错误。如果不是那样的话,那就是别的东西了。我觉得我的项目已经改变了很多,现在只是试图解决代码签名问题,结果一切都搞砸了。我严格按照说明进行操作,但出现错误,例如当前的“
我不确定是否有一些我不知道的内置变量或规则,或者 make 是否有问题,或者我只是疯了。 对于我的一个项目,我有一个如下的 makefile: CC=g++ CFLAGS=-O3 `libpng-co
我有大约 10 个 div,它们必须不断翻转,每个 div 延迟 3 秒 这个 codrops 链接的最后一个效果是我正在寻找的,但无需单击 div http://tympanus.net/Devel
我如何使用 jQuery 持续运行 PHP 脚本并每秒获取响应,以及将鼠标上的少量数据发送到同一脚本? 我真的必须添加一些随机扩展才能让这么简单的计时器工作吗? 最佳答案 To iterate is
JBoss 4.x EJB 3.0 我见过如下代码(大大简化): @Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPO
使用 PHPStorm,我试图忽略每次尝试进行 git 提交时 pop 的 workspace.xml。 我的 .gitignore 看起来像: /.idea/ .idea/workspace.xml
我是一名优秀的程序员,十分优秀!