3

node.js アプリで検索をキャッシュする方法が必要です。redis を使用するアイデアがありましたが、実装方法がわかりません。

私がやりたいことは、RAM の量が限られているため、キャッシュされる検索の数に厳しい制限を設けることです。検索ごとに、検索クエリと対応する検索結果を保存したいと考えています。

キャッシュされる検索数のハード リミットが 4 であるとします。各検索クエリは、次の図のボックスです。

ここに画像の説明を入力

キャッシュされていない新しい検索があった場合、新しい検索は一番上にプッシュされ、一番下の検索クエリは削除されます。

ここに画像の説明を入力

ただし、キャッシュされた検索があった場合、キャッシュされた検索クエリはその位置から削除され、キャッシュの先頭に追加されます。たとえば、search 3検索された場合。

ここに画像の説明を入力

これを行うことで、比較的同じ量のメモリを使用しますが、最も検索されたクエリは常にキャッシュに残り、人気の低い検索はキャッシュを通過して削除されます。

私の質問は、これをどのように正確に行うのでしょうか? リストでできたのではないかと思いましたが、リストに値が存在するかどうかを確認する方法がわかりません。また、セットのスコアをインデックスに設定するソート済みセットでこれを行うことができるかもしれないと考えましたが、検索クエリがキャッシュ内で移動された場合、すべてのシングルのスコアを変更する必要がありますセット内の要素。

4

3 に答える 3

3

最も簡単なのは、検索キャッシュを処理するためだけに新しい redis インスタンスをスピンアップすることです。このインスタンスでは、必要に応じて最大メモリを設定できます。次にmaxmemory-policy、このインスタンスを に設定しますallkeys-lru。これを行うことで、redis は使用頻度の最も低いキャッシュ エントリを自動的に削除します (これが必要です)。また、キャッシュ エントリの最大数ではなく、メモリ使用量によって実際に制限します。

次に、この redis インスタンスにキーを as: として挿入search:$seachterm => $cachedvalueし、たとえば、このキーの有効期限を数分間設定します (古い回答を提供しないようにします)。これを行うことで、redis は大変な作業をしてくれます。

于 2012-05-07T15:34:21.363 に答える
2

あなたは間違いなくsortedsetを使いたい

これがあなたがすることです:

最初のクエリ: sortedset から一番上の要素を選択します: zrevrange(0,1) WITHSCORES

2 番目のクエリ: 複数の場合: A. 取得したスコア + 1 で要素を挿入します。その要素が既にリストに存在する場合は、単純に再スコアリングされ、2 回追加されることはありません。

B.zremrankbyrank。私はこれをテストしていませんが、必要なパラメーターは (0,-maxListSize) だと思います

于 2012-05-07T15:30:19.460 に答える