使用memcached更新用户的“通知”

时间:2013-08-14 22:51:09

标签: ruby-on-rails notifications memcached

我有一个用户'通知'的应用程序认为SO或Facebook或推特。但是,由于通知不一定会在每个页面视图中更改,我决定将它们保存在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

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

1 个答案:

答案 0 :(得分:1)

  1. 目前您手动连接到Memchaced,检查密钥是否存在,存储内容,是否过期。但是你可能会注意到这很乏味而且很快就会重复。
  2. 但是,Rails为您提供了一些模式,您可以使用它们来实现这一目标,但更容易。
  3. 首先使用Cache Stores选项,您可以指示rails使用Memchached

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

    此缓存存储使用memcached服务器提供   应用程序的集中式缓存。 Rails使用捆绑的dalli   宝石默认情况下。这是目前最受欢迎的缓存商店   生产网站。它可用于提供单个共享缓存   具有高性能和冗余的集群。

         

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

         

    此缓存上的write和fetch方法接受另外两个   利用memcached特有的功能的选项。您可以   指定:raw直接向服务器发送值,不带   序列化。该值必须是字符串或数字。您可以使用   memcached直接操作,如仅在raw上增加和减少   值。如果不需要memcached,还可以指定:unless_exist   覆盖现有条目。

    使用rails Cache store而不是直接使用Dalli允许您使用以下Nicer API

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

    现在,实际缓存的rails。您可以使用Declarative EtagsFragment Caching来缓存通知。这是一个使用Declarative Etags

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

    现在,声明式E-tags的工作方式是在请求时不呈现模板 发送匹配的ETag&缓存副本已发送。但是,当@new_notification更改时,E-tag值也会发生变化。从而导致缓存过期。现在,缓存是一个广泛的主题,涵盖&有各种各样的技术来做到这一点。所以我不会给你一个完整的答案,但我会指出以下资源,以便你可以了解更多:

    快乐缓存; - )