これは私が考えた解決策で、まだ実装していませんが、同じ問題に直面しています。実際の有効期限を独自のキーにキャッシュします。キーは、検索 URL の標準的な表現になります。つまり、「ページ」パラメータはありません。例えば:
ユーザーはhttp://example.com?q=foo&page=3で検索するため、 params は{ q: 'foo', page: 3 }
. "page=3" を取り除くと、{ q: 'foo' } が残ります。
それを実行to_param
してプレフィックスを追加すると、 のようなキャッシュ キーが残りますsearch_expiry_q=foo
。
この正規クエリ、つまり Rails.cache.read( search_expiry_q=foo
) のキャッシュを検索します。存在する場合は、この時点で結果を期限切れにします。残念ながら しかなく しかexpires_in
ないexpires_at
ので、計算する必要があります。つまり、次のようなものですexpires_in: expiry_time - Time.now - 5.seconds
(5 秒で競合状態を防ぐことができれば幸いです)。この方法で完全な URL/パラメーターをキャッシュします。
OTOH 有効期限がない場合は、最近誰も検索を実行していません。そこで、次のようにします。
expiry_time = Time.now + 1.hour
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour)
そして、このフラグメント/ページを、再び完全な URL/パラメーターでキャッシュし、expires_in: 1.hour.