繁体   English   中英

如何缓存自动建议组件的结果?

[英]How to cache results for autosuggest component?

我有一个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条建议。

实施服务器端缓存的最佳方法是什么?

您可以使用LRU(最近最少使用)丢弃算法来实现简单的缓存。 基本上,设置一些阈值(例如:100,000个项目,1 GB),然后丢弃最近最少使用的项目(即,处于高速缓存中但最后一次访问的时间比其他任何项目都早的项目)。 这实际上效果很好,并且我确定您可以在其中使用现有的Node.js包

如果您要构建具有多个前端服务器的服务,则仅在服务器上设置内存缓存 (或者如果服务器上的负载相对较低,甚至将其放在前端服务器上)可能会更容易,更简单。 。 它有一个非常简单的TCP / IP协议,并且有可用于Node.js的内存缓存客户端

Memcached易于设置,并且可以扩展很长时间。 将缓存保留在单独的服务器上还具有潜在的好处,即可以加快对所有前端实例的请求,即使以前没有收到特定请求的实例也是如此。

无论您选择做什么,我都建议将缓存保留在处理请求的过程之外。 如果您遇到缓存问题或出于某种原因需要释放内存,这将使杀死缓存变得很容易。

(内存问题)。 数据集中大约有20000条建议。

20,000个结果? 您是否考虑过家里实际需要的大量内存? 我的回答是假设您正在谈论示例中介绍的20,000个短字符串。 我觉得您正在针对尚未解决的问题进行优化。

如果您谈论的是静态数据,请将其保存在内存中。 即使您要将其存储在数据库中,也要将其保留在内存中。 如果需要,请定期刷新。

如果它不是静态的,请尝试在每次请求时首先从数据库中读取它。 数据库具有查询缓存,并且将在100KB表中进行早餐。

一旦您实际获得足够的点击量来使其成为一个实际问题,就不要自己对其进行缓存。 我发现,如果您确实确实需要缓存,那么其他人会比您编写的要好 但是,如果您真的需要一个,请选择外部存储器,例如Memcached或什至是Redis。 将这些内容保留在外部可以使测试和可伸缩性变得更容易。

但是您会知道何时真正需要缓存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM