ruby-on-rails - 基于客观信息的新闻提要缓存解决方案?

标签 ruby-on-rails mongodb caching redis memcached

我需要一些关于缓存可更新新闻提要的最佳建议。

拜托,也请不要“狂热者”回答 - 不要寻找“最佳”系统的主观意见,只是寻求一些符合以下要求的技术建议。因此,请分享您在现实世界中使用的内容,即使您更喜欢其他解决方案。

我有一个基于 Rails 的新闻提要(Neo4j 数据库),虽然性能不错,但我想缓存它,这样服务器就不会陷入服务实时提要的泥潭。

要求:

  • 简单的片段更新:我想轻松地更新用户新闻源的部分内容 基于特定触发器的缓存,例如,当用户编辑时 他们的状态更新——我不想重新生成用户的整个 缓存中的新闻提要,而我只想更新那个 特定用户提要的“片段”或部分(如果您愿意)。而且我不想跳过障碍来尝试这样做。

  • 删除:如果有人删除了一个事件,我只想删除那个事件 在系统最终为该用户刷新整个提要之前从他们的新闻提要中获取。

  • 轻松检索:我想以这样一种方式检索缓存,rails Controller /模型可以轻松读取它们并将它们传递给 View 而无需 意见的任何修改。

  • 持久性:如果我需要重新启动缓存,它应该加载 从磁盘缓存。这意味着它应该将缓存的条目保存到磁盘。

  • 速度:鉴于它必须能够更新缓存的片段 新闻提要,将会有某种性能影响。但 我需要速度..

哪些缓存技术提供了这样的功能? Redis、MongoDB、Memcached 能满足这些要求吗?还有哪些其他选择? (CouchDB、东京文件柜等)..

本着 Stack Overflow 的精神,我不是在询问您更喜欢什么以及为什么的主观意见,我只是在询问您可能在生产中实际使用过的可能的候选系统来完成缓存和更新缓存的新闻饲料(或任何类似的东西)。

最佳答案

由于它主要是一个基于意见的话题,所以这个答案将是主观的。但无论如何我都会努力保持事实。

首先要注意的一点是您的要求往往是相互排斥的。正如我们在法国所说,你想要黄油、黄油的钱和农夫的妻子(好吧,这可能是一个糟糕的翻译)。

例如,为了支持简单的片段更新和适当的删除,您需要在缓存中使用某种数据结构。我对 Rails 的了解为零,但我想它会对数据访问模式以及 Controller /模型的定义产生影响。换句话说,它会增加数据检索的复杂性。您需要速度,但与此同时,您还需要持久性和非平凡的数据访问模式。好吧,您无法同时获得所有内容,您必须做出选择,并对这些要求进行优先排序。

我的第二点是缓存仅在缓存和底层存储引擎在性能方面存在显着差异时才有用。由于您已经使用了相当高效的 NoSQL 引擎 (Neo4j),因此您只需要考虑真正为原始性能设计的引擎(即低延迟存储):memcached , redis , couchbase , aerospike , 以命名成熟的开源产品。如果你觉得有点冒险,你也可以考虑其他项目,比如tarantool。或 hyperdex .

还有许多商业产品,但我不确定它们是否提供 Ruby 客户端(TIBCO ActiveSpaces、Gigaspaces、Red-Hat Infinispan 等...)

其他 NoSQL 引擎(MongoDB、Cassandra、CouchDB 等)具有其他有趣的属性,但它们无法在混合读写工作负载的原始性能上击败这些解决方案。在这里,我只谈论原始性能(即高吞吐量下的低延迟),而不是可扩展性。

其实可以排除memcached,因为它不支持持久化。我会说你可能可以用 Redis、Couchbase 或 Aerospike 实现你想要的东西,但 Aerospike 3 似乎还没有官方支持的 Ruby 客户端。

Redis 和 Aerospike 比 Couchbase 更容易支持多个数据访问路径(即一致的索引数据结构)。使用 Couchbase 或 Aerospike 比使用 Redis 更容易实现高可用性。使用 Redis 和 Couchbase 比使用 Aerospike 更容易实现缓存行为。

一些一般性建议:

  • 在添加额外层的复杂性之前,请确保您确实存在 Neo4j 的性能或可扩展性问题。复杂性就像牙膏:一旦从 pipe 里出来,就再也放不回去了。

  • 数据访问模式应在设计时列出,并且必须由所选引擎中的相应数据结构支持。

  • 还必须考虑硬件占用空间。如果您只有几个盒子,请选择像 Redis 这样的轻量级解决方案。

  • 对于持久性,您还需要考虑 HA。如果缓存层丢失会怎样?其实我想说对于缓存来说,HA可能比持久性更重要。

最后,您还需要定义您想要的确切缓存语义(更新行为、失效行为、缓存未命中管理、TTL 策略(如果有的话)等等)。我列出的 3 个 NoSQL 引擎提供了一些工具来帮助实现各种策略,但它们都不支持现成的策略。这将需要一些编码来实现它。

关于ruby-on-rails - 基于客观信息的新闻提要缓存解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24857442/

相关文章:

node.js - 使用 Mongoose 和 Node.js 删除 MongoDB 中一对多和多对多关系中的引用

mongodb - 在 mongodb 中按带时间戳的日期聚合数据

java - 用于类继承的 Spring Data MongoDb

ruby-on-rails - 如何在 Heroku 上使用机架/缓存缓存超过 1MB 的文件?

ruby-on-rails - Rails 中的用户到用户消息

ruby-on-rails - 使用 Upstart 启动 Sidekiq

python - 删除 *.pyc 并重新运行 .py 脚本后的奇怪行为

在 Wordpress 中缓存的 jquery 问题

ruby-on-rails - 在 Dreamhost 共享主机上运行 Rails 4

sql - 根据一组相关记录的条件获取记录