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

我忽略了这个实现中的明显缺陷。一旦通知被加载,它们将永远不会被刷新,直到用户注销或缓存条目过期。一种方法是在发生新通知的事件时取消用户的缓存条目。这将强制向数据库发出新请求。还有其他方法可以实现吗?

4

1 回答 1

1
  1. 目前您正在手动连接到 Memchaced,检查密钥是否存在,存储内容,使其过期。但是您可能会注意到,这很快就会变得乏味和重复。
  2. 但是,Rails 为您提供了一些可以用来完成此任务但更容易的模式。

首先使用Cache Stores选项,您可以指示 rails 使用 Memchached

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

此缓存存储使用 memcached 服务器为您的应用程序提供集中式缓存。Rails 默认使用捆绑的 dalli gem。这是目前最流行的生产网站缓存存储。它可用于提供具有非常高的性能和冗余的单个共享缓存集群。

初始化缓存时,您需要指定集群中所有 memcached 服务器的地址。如果没有指定,它将假定 memcached 在默认端口上的本地主机上运行,​​但这不是大型站点的理想设置。

此缓存上的 write 和 fetch 方法接受两个附加选项,这些选项利用特定于 memcached 的功能。您可以指定 :raw 将值直接发送到服务器而不进行序列化。该值必须是字符串或数字。您可以仅对原始值使用 memcached 直接操作,例如递增和递减。如果您不希望 memcached 覆盖现有条目,也可以指定 :unless_exist。

使用 Rails 缓存存储而不是直接使用 Dalli 允许您使用以下更好的 API

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

现在,用于实际缓存的导轨。您可以使用Declarative EtagsFragment Caching缓存通知。这是一个使用声明性 Etags 的示例

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

现在,声明性电子标签的工作方式是,当请求发送匹配的 ETag 并发送缓存副本时,不会呈现模板。但是,当 @new_notification更改时,E-tag 值也会更改。从而导致缓存过期。现在,缓存是一个广泛的话题,并且有多种技术可以做到这一点。所以可能我不会给你一个完整的答案,但我会指出以下资源,这样你就可以了解更多:

快乐缓存;-)

于 2013-08-14T23:30:19.503 回答