首先,让我解释一下情况,我有以下内容:
"Node"类,具有以下属性:
- node_id(唯一)
- node_name(唯一)
还有一个"NodeConnection"类,具有以下属性:
- node_from
- node_to
我们将拥有大约100万到300万个节点和大约300万到1000万个节点连接。
在导入节点和连接后,它们不会改变。
对于Rails应用程序的每个请求,我们将根据可能的节点名称查找大约10到100个节点ID。我们必须查找几百到几千个节点连接。
目前,我们在没有任何缓存的情况下进行了原型设计(因此,需要进行大量的数据库查询),响应时间非常慢(如2分钟)。 因此,我们切换到通过memcached缓存节点和连接。
得到了性能提升,但仍然缺乏性能。(因为我们为每个NodeConnection调用Cache.read,这是每个请求中的数千个调用)
现在,我们尝试使用Classvariable进行缓存,并获得了巨大的性能提升。(响应时间在几百毫秒内)
# Pseudocode below
class Node
def nodes
@@nodes ||= get_nodes
end
def node_connections
@@node_connections ||= get_node_connections
end
end
因此,我想询问这种解决方案的优点和缺点。
目前我遇到的缺点:
- 每个Rails实例都必须建立自己的缓存(自己的ClassVariables)-> 总内存使用率更高
- 初始化缓存需要时间(1-3分钟),所以我们不能在请求中完成此操作
是否有其他解决方案可以高效地缓存大型(>100MB)且静态(数据在应用程序生命周期内不会更改)的数据,以便同一台机器上的所有Rails实例都可以快速访问此缓存(!)?
Struct
而不是实际类,或者使用自定义的 C 绑定吗?这也可以提高性能。 - m_x