Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用类变量缓存(大型和静态)数据_Ruby On Rails_Ruby_Caching_Memcached - Fatal编程技术网

Ruby on rails 使用类变量缓存(大型和静态)数据

Ruby on rails 使用类变量缓存(大型和静态)数据,ruby-on-rails,ruby,caching,memcached,Ruby On Rails,Ruby,Caching,Memcached,首先,让我解释一下情况,我有以下几点: 具有以下属性的“节点”类: 节点id(唯一) 节点名称(唯一) 以及具有以下属性的“NodeConnection”类: 节点从 节点到 我们将有大约100万到300万个节点和大约300万到1000万个节点连接 导入一次节点和连接后,它们不会更改 在对Rails应用程序的每个请求中,我们必须通过可能的节点名称查找大约10到100个节点ID。我们必须查找几百到几千个节点连接 我们目前在没有任何缓存的情况下创建了原型(因此,很多数据库查询),响应时间非常

首先,让我解释一下情况,我有以下几点:

具有以下属性的“节点”类:

  • 节点id(唯一)
  • 节点名称(唯一)
以及具有以下属性的“NodeConnection”类:

  • 节点从
  • 节点到
我们将有大约100万到300万个节点和大约300万到1000万个节点连接

导入一次节点和连接后,它们不会更改

在对Rails应用程序的每个请求中,我们必须通过可能的节点名称查找大约10到100个节点ID。我们必须查找几百到几千个节点连接

我们目前在没有任何缓存的情况下创建了原型(因此,很多数据库查询),响应时间非常糟糕(大约2分钟)。 因此,我们通过memcached切换到缓存节点和连接

获得了性能提升,但仍然缺乏性能。(因为我们为每个节点连接调用Cache.read,即每个请求调用几千次)

现在,我们尝试通过Classvariable进行缓存,并获得了巨大的性能提升。(响应时间在几百毫秒以内)

所以,我想问一下这个解决方案的优点和缺点

我还有一些缺点:

  • 每个Rails实例都必须构建自己的缓存(它自己的类变量)->更高的总内存使用率
  • 初始化缓存非常耗时(1-3分钟),因此我们无法在请求中执行此操作

有没有其他解决方案可以高效缓存大型(>100MB)和静态(数据在应用程序生命周期内不会更改)数据,以便同一台机器中的所有rails实例都可以非常快速地访问此缓存(!)?

这听起来像是一种非常特殊的情况,但为了避免在内存缓存中需要每个进程(即你的类变量)为了自然预热,我将研究编写预热过程脚本并在初始化器中运行它的可行性…你的应用程序可能需要更长的时间启动,但你的用户不必等待


编辑|请注意,如果您使用的是Unicorn之类的东西,它支持在分支工作进程之前预加载应用程序代码,您可以将此类初始化的影响降至最低。

感谢Unicorn的提示。我会尝试一下。(Unicorn的另一个原因:nginx和passenger存在一些问题)只是一个想法,不知道它是好是坏-您是否尝试过使用
结构而不是实际的类,或者使用自定义C绑定?这可以提高性能,我来看看。您可能有一些C绑定的资源?其他上帝或坏主意:编写一个在本地UNIX套接字上提供数据的小C应用程序,然后使用Caches数据本身这将是一个开始:所以你有节点和节点连接-听起来它们可以连接到树或图形中?需要更多细节来考虑数据结构,它可以容纳这些项目。原因:memcache很快,但加载数百万个缓存似乎很慢。我会尝试打包节点和节点连接预热可以通过初始化器、加载钩子和cron作业来完成(对于类似这样的东西,仍然像它们一样)。
# Pseudocode below
class Node
  def nodes
    @@nodes ||= get_nodes
  end
  def node_connections
    @@node_connections ||= get_node_connections
  end
end