我有一个UI自动提示组件,它以用户类型的形式执行AJAX请求。例如,如果用户键入mel
,则响应可能是:
{
suggestions: [{
id: 18,
suggestion: 'Melbourne'
}, {
id: 7,
suggestion: 'East Melbourne'
}, {
id: 123,
suggestion: 'North Melbourne'
}]
}
UI组件实现客户端缓存。因此,如果用户现在单击 b (检索melb
的结果),然后 Backspace ,则浏览器已在内存中显示mel
的结果,所以他们立即可用。换句话说,每个客户端对每个给定的输入最多只能进行一次AJAX调用。
现在,我想在此基础上添加服务器端缓存。因此,如果一个客户端为mel
执行AJAX调用,并且假设有一些繁重的计算正在准备响应,那么其他客户端将获得结果而不再执行这个繁重的计算。
我可以简单地获得查询和结果的哈希值,但我不确定这是实现此目的的最佳方式(内存问题)。数据集中有大约20000条建议。
实现服务器端缓存的最佳方法是什么?
答案 0 :(得分:4)
您可以使用LRU(最近最少使用的)丢弃算法实现简单缓存。基本上,设置几个阈值(例如:100,000个项目,1 GB),然后丢弃最近最少使用的项目(即,缓存中但最后一次访问的项目比任何其他项目更长)。这实际上非常有效,我确信您可以使用an existing Node.js package out there。
如果您要构建具有多个前端服务器的服务,那么在服务器上设置memcached可能更容易也更简单(或者如果您在服务器上设置memcached clients您的服务器负载相对较低)。它有一个非常简单的TCP / IP协议,并且https://developer.getpebble.com/guides/design-and-interaction/可用于Node.js。
Memcached易于设置,并且可以在很长一段时间内扩展。将缓存保存在单独的服务器上还有可能加快对所有前端实例的请求,甚至是之前未收到特定请求的实例。
无论您选择做什么,我都建议将缓存保留在提供请求的过程之外。如果你有缓存问题或者出于某种原因需要释放内存,那么就可以轻松杀死缓存。
答案 1 :(得分:2)
(记忆问题)。数据集中有大约20000条建议。
20,000结果?你有没有想过家里会有多少记忆?我的回答是假设您正在讨论示例中提供的20,000个短字符串。我觉得你正在优化你还没有的问题。
如果您正在谈论一个相当静态的数据,只需将其保存在内存中即可。即使您想将其存储在数据库中,也只需将其保存在内存中即可。如果必须,请定期刷新。
如果它不是静态的,只需先尝试从数据库中读取每个请求。数据库有查询缓存,将在早餐时通过一张100KB的表格进行咀嚼。
一旦你真的获得足够的点击率来成为一个实际问题,不要自己缓存它。我发现,如果你真的需要缓存,那么其他人就会编写它better than you would have。但是如果你真的需要一个,那就去找一个像Memcached这样的外部产品,甚至是像Redis这样的产品。保持外部的东西可以使测试和可伸缩性更容易。
但是你知道什么时候你真的需要缓存。