如何cachingautosuggest组件的结果?

我有一个用户types执行AJAX请求的UI自动提示组件。 例如,如果用户键入mel ,则响应可能是:

 { suggestions: [{ id: 18, suggestion: 'Melbourne' }, { id: 7, suggestion: 'East Melbourne' }, { id: 123, suggestion: 'North Melbourne' }] } 

UI组件实现客户端caching。 因此,如果用户现在点击b (检索melb结果),然后Backspace ,浏览器已经在内存中获得了mel结果,所以它们立即可用。 换句话说,每个客户对每个给定的input最多只能做一次AJAX调用。

现在,我想在此之上添加服务器端caching。 因此,如果一个客户端为mel执行一个AJAX调用,并且假设有一些繁重的计算正在准备响应,其他客户端将会得到结果而不会再执行这个繁重的计算。

我可以简单地对查询和结果进行散列,但我不确定这是实现这一点的最佳方式(内存问题)。 数据集中有~20000条build议。

什么是实现服务器端caching的最佳方式?

你可以用一个LRU(最近最less使用的)丢弃algorithm来实现一个简单的caching。 基本上,设置一些阈值(例如:100,000个项目,1 GB),然后丢弃最近最less使用的项目(即,在caching中但最后访问的项目比其他任何项目早)。 这实际上工作得很好,我相信你可以使用现有的Node.js包 。

如果要构build一个具有多个前端服务器的服务,在服务器上设置memcached可能会更容易也更简单(如果服务器负载相对较低,甚至可以将其放在前端服务器上) 。 它有一个非常简单的TCP / IP协议,并有Node.js的memcached客户端 。

Memcached很容易build立,并将在很长时间内扩展。 将caching保存在不同的服务器上也有加速对所有前端实例的请求的潜在好处,即使是之前没有收到特定请求的前端实例。

不pipe你select做什么,我都会build议将caching放在服务于请求的进程之外。 如果你有caching问题,或者出于某种原因需要释放内存,那么只要杀死caching就容易了。

(记忆担忧)。 数据集中有~20000条build议。

20,000结果? 你有没有想过家里会有多less记忆呢? 我的回答是假设您正在讨论示例中介绍的20000个短string。 我觉得你正在优化你还没有的问题。

如果你正在谈论一个合理的静态数据,就把它保存在内存中。 即使您想将其存储在数据库中,只要将其保存在内存中即可。 如果必须定期刷新它。

如果它不是静态的,只要先尝试从每个请求的数据库中读取它。 数据库有查询caching,并将通过一个100KB的表啃早餐。

一旦你真的得到足够的点击这个成为一个真正的问题,不要自己caching。 我发现,如果你确实需要一个caching,其他人写的比你更好 。 但是,如果你真的需要一个,像Memcached一样的外部,甚至像Redis的东西。 保持外部的东西可以使testing和可扩展性变得更容易。

但是当你真正需要一个caching的时候你会知道的。