我需要一种方法来缓存我的node.js应用上的搜索。我有一个使用redis的想法,但我不确定如何实现它。
我想要做的是对将要缓存的搜索量进行严格限制,因为我的RAM数量有限。对于每次搜索,我都希望存储搜索查询和相应的搜索结果。
让我们说我对缓存的搜索次数的硬限制是4.每个搜索查询都是下图中的一个框:
如果有新的搜索没有被缓存,则新搜索会被推到顶部,而底部的搜索查询会被删除。
但是如果有一个缓存的搜索,缓存的搜索查询将从其位置移除并添加到缓存的顶部。例如,如果搜索了search 3
。
通过这样做,我使用相同数量的内存,而搜索次数最多的查询总是在缓存中浮动,不太流行的搜索将通过缓存并被删除。
我的问题是,我到底该怎么做?我以为我可能已经能够使用列表,但我不知道如何检查列表中是否存在值。我还以为我可以用排序集来做这个,我将集合的分数设置为索引,但是如果搜索查询在缓存中移动,我需要更改每个单独的分数集合中的元素。
答案 0 :(得分:3)
最简单的方法是启动新的redis实例,仅用于处理搜索缓存。对于此实例,您可以根据需要设置最大内存。然后,您将此实例的maxmemory-policy
设置为allkeys-lru
。通过执行此操作,redis将自动删除最近最少使用的缓存条目(这是您想要的)。此外,您将通过内存使用而不是最大缓存条目数来限制。
对于这个redis实例,您将插入密钥为:search:$seachterm => $cachedvalue
并设置此密钥的过期时间为几分钟(因此您不会提供过时的答案)。通过这样做,redis将为你付出艰苦的努力。
答案 1 :(得分:2)
您肯定想使用sortedset
这是你做的:
第一个查询:从您的sortedset中选择顶部元素:zrevrange(0,1)WITHSCORES
第二个查询:在多个中,执行: A.使用您检索到的分数插入您的元素+ 1.如果该元素已存在于列表中,则只会重新调整该元素并且不会添加两次。
B. zremrankbyrank。我没有测试过这个,但我认为你想要的参数是(0,-maxListSize)
答案 2 :(得分:0)
看一下 ZREMRANGEBYRANK 。您可以将已排序集中的数据量限制为给定大小。