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(唯一)
- 节点名称(唯一)
- 节点从
- 节点到
- 每个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