0

SO、Facebook、Twitterなどのユーザー「通知」を使用したアプリケーションがあります。ただし、すべてのページ ビューで通知が変更されるとは限らないため、通知を memcached に保存することにしました。

   def get_notification
     if current_user
       mc = Dalli::Client.new('localhost:11211')
       require_dependency 'notification.rb'
             @new_notification = mc.get(current_user.id.to_s+'new_notification')
             if  @new_notification == nil
              @new_notification = Notification.getNew(current_user.id)
              mc.set(current_user.id.to_s+'notification',@new_notification)
            end
     end
   end

この実装の明らかな欠陥を見落としていました。通知が読み込まれると、ユーザーがログアウトするか、キャッシュ エントリの有効期限が切れるまで更新されません。これを行う 1 つの方法は、新しい通知のイベントが発生したときにユーザーのキャッシュ エントリを無効にすることです。これにより、データベースへの新しいリクエストが強制されます。これを実装する他の方法はありますか?

4

1 に答える 1

1
  1. 現在、手動で Memchaced に接続しています。キーが存在するかどうかを確認し、コンテンツを保存して期限切れにします。しかし、お気づきかもしれませんが、これはすぐに退屈で繰り返しになります。
  2. ただし、Rails は、これをより簡単に実現するために使用できるいくつかのパターンを提供します。

最初Cache Storesにオプションを使用して、レールにMemchachedを使用するように指示できます

config.cache_store = :mem_cache_store, "example.com"

このキャッシュ ストアは memcached サーバーを使用して、アプリケーションに一元化されたキャッシュを提供します。Rails は、バンドルされている dalli gem をデフォルトで使用します。これは現在、実稼働 Web サイトで最も人気のあるキャッシュ ストアです。これを使用して、非常に高いパフォーマンスと冗長性を備えた単一の共有キャッシュ クラスターを提供できます。

キャッシュを初期化するときは、クラスター内のすべての memcached サーバーのアドレスを指定する必要があります。何も指定されていない場合、memcached がデフォルト ポートのローカル ホストで実行されていると想定されますが、これは大規模なサイトには理想的な設定ではありません。

このキャッシュの write メソッドと fetch メソッドは、memcached に固有の機能を利用する 2 つの追加オプションを受け入れます。:raw を指定して、値をシリアル化せずにサーバーに直接送信できます。値は文字列または数値でなければなりません。インクリメントやデクリメントなどの memcached 直接操作は、生の値に対してのみ使用できます。memcached に既存のエントリを上書きさせたくない場合は、:unless_exist を指定することもできます。

Dalli を直接使用する代わりに rails Cache store を使用すると、次の Nicer API を使用できます。

Rails.cache.read('key')
Rails.cache.write('key', value)
Rails.cache.fetch('key') { value }

さて、実際にキャッシュするためのレール。Declarative EtagsまたはFragment Cachingを使用して通知をキャッシュできます。これは、宣言型 Etags を使用した例です

def get_notification
     if current_user
       @new_notification = Notification.getNew(current_user.id)
     end
    refresh_when @new_notification 
end

現在、宣言型E タグが機能する方法は、リクエストが一致する ETag を送信し、キャッシュ コピーが送信されたときに、テンプレートがレンダリングされないことです。ただし、 @new_notification変更すると E タグの値も変更されます。したがって、キャッシュの有効期限が切れます。現在、キャッシングはカバーすべき膨大なトピックであり、それを行うためのさまざまなテクニックがあります。したがって、おそらく完全な回答はできませんが、次のリソースを参照して、詳細を確認してください。

ハッピーキャッシング;-)

于 2013-08-14T23:30:19.503 に答える