5

分離されたワーカーを使用して、キャッシュを構築および操作しようとしています。私はこれらの労働者をできるだけスリムに保ちたいと思っています。(レールは使いません)

Railsで生成されたキャッシュキーを偽造するのに苦労しています

私の見解では、これがあります:

cache ["comments", @ama]

私はそれが生成するキーを次のように複製しようとしています:

updated_at = Time.parse(row['updated_at'])
timestamp = updated_at.utc.strftime('%Y%m%d%H%M%S')
cache_key = "views/comments/amas/#{row['id']}-#{timestamp}"

どちらが生成されますか:

views/comments/amas/432-20121227010114

そのキーからのキャッシュは空白です。

キーを正しくフォーマットしていないか、キャッシュがありません。探しているキャッシュがそこにあると 95% 確信しています。

(「test」などのキーでキャッシュをプッシュしてから戻すことができます。したがって、キャッシュが機能していることがわかります)

参考文献:

役立つ情報:

  • キャッシュ サーバーはローカルではありません。はい、私はそれを指しています。
  • キーが存在しなくても、本番環境でページをロードすると、キーとキャッシュがその場で構築されます。私が試したもの。
  • Rails 4.0.0 を使用する
4

2 に答える 2

7

低レベルのキャッシュを実装する最も効率的な方法は、Rails.cache.fetch メソッドを使用することです。利用可能な場合、キャッシュから値を読み取ります。それ以外の場合は、渡されたブロックを実行し、結果を返します。

Railsコンソールからキャッシュキーを手動で設定できます(コマンドプロンプトで「rails c」と入力して)

>> Rails.cache.fetch('answer')
==> "nil"
>> Rails.cache.fetch('answer') {1 + 1}
==> 2
Rails.cache.fetch('answer')
==> 2

次の例を考えてみましょう。アプリケーションには、在庫切れのすべてのアイテムを返すクラス メソッドを含む Product モデルと、競合する Web サイトで製品の価格を検索するインスタンス メソッドがあります。これらのメソッドによって返されるデータは、低レベルのキャッシュに最適です。

# product.rb

def Product.out_of_stock
  Rails.cache.fetch("out_of_stock_products", :expires_in => 5.minutes) do
    Product.all.joins(:inventory).conditions.where("inventory.quantity = 0")
  end
end

def competing_price
  Rails.cache.fetch("/product/#{id}-#{updated_at}/comp_price", :expires_in => 12.hours) do
    Competitor::API.find_price(id)
  end
end

お役に立てると思います。

ありがとう。

于 2013-07-16T15:01:24.283 に答える
6

テンプレート キャッシュ キーは次のようになります。

views/projects/123-20120806214154/7a1156131a6928cb0026877f8b749ac9
       ^class   ^id ^updated_at    ^template tree digest

参考:http ://api.rubyonrails.org/classes/ActionView/Helpers/CacheHelper.html#method-i-cache

于 2013-07-16T14:23:19.343 に答える