3

我需要一种在我的 node.js 应用程序上缓存搜索的方法。我有一个使用 redis 的想法,但我不确定如何实现它。

我想要做的是对要缓存的搜索数量有一个硬性限制,因为我的 RAM 数量有限。对于每次搜索,我想存储搜索查询和相应的搜索结果。

假设我对缓存搜索数量的硬限制是 4。每个搜索查询都是下图中的一个框:

在此处输入图像描述

如果有未缓存的新搜索,则新搜索将被推到顶部,而底部的搜索查询将被删除。

在此处输入图像描述

但是,如果有一个搜索被缓存,缓存的搜索查询将从其位置删除并添加到缓存的顶部。例如,如果search 3被搜索。

在此处输入图像描述

通过这样做,我使用了相对相同数量的内存,而搜索最多的查询将始终在缓存中浮动,而不太受欢迎的搜索将通过缓存并被删除。

我的问题是,我该怎么做呢?我以为我可以用列表来做到这一点,但我不确定如何检查列表中是否存在值。我还认为我可以使用排序集来做到这一点,我会将集合的分数设置为索引,但是如果搜索查询在缓存中移动,我需要更改每个单独的分数集合中的元素。

4

3 回答 3

3

对您来说最简单的是启动新的 redis 实例来处理搜索缓存。对于这种情况,您可以根据需要设置最大内存。然后,您将maxmemory-policy为此实例设置为allkeys-lru. 通过这样做,redis 将自动删除最近最少使用的缓存条目(这是您想要的)。此外,您将真正受到内存使用量的限制,而不是缓存条目的最大数量。

然后,您将为此 redis 实例插入密钥:search:$seachterm => $cachedvalue并为此密钥设置过期几分钟(这样您就不会提供过时的答案)。通过这样做,redis 将为您完成艰苦的工作。

于 2012-05-07T15:34:21.363 回答
2

你肯定想使用 sortedset

这就是你要做的:

第一个查询:从排序集中选择顶部元素:zrevrange(0,1) WITHSCORES

第二个查询:在一个多,做: A.插入你的元素,你检索到的分数+ 1。如果该元素已经存在于列表中,它将被简单地重新计分,而不是添加两次。

B. zremrankbyrank。我没有测试过这个,但我认为你想要的参数是 (0,-maxListSize)

于 2012-05-07T15:30:19.460 回答
0

看看ZREMRANGEBYRANK。您可以将排序集中的数据量限制为给定大小。

http://redis.io/commands/zremrangebyrank

于 2013-11-24T23:19:02.060 回答