【问题标题】:Updating 'notifications' for a user with memcached使用 memcached 为用户更新“通知”
【发布时间】:2013-08-14 22:51:09
【问题描述】:

我有一个用户“通知”的应用程序认为 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

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

【问题讨论】:

    标签: ruby-on-rails notifications memcached


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

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

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

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

    在初始化缓存时,需要指定所有的地址 集群中的 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
    

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

    快乐缓存 ;-)

    【讨论】:

    • 我使用了上面的代码 config.cache_store = :mem_cache_store, "localhost:11211" 。我的 memcache 确实在运行,但在服务器重新启动时,出现错误“您的应用程序中没有安装 memcache-client。请将其添加到您的 Gemfile 并运行 bundle install”
    • 我的问题中的代码是有效的,我也将 Dalli 用于其他目的,所以上述错误不可能是正确的。
    • ^^^你必须在轨道上v3.x?因为在 rails 4 上,:mem_cache_store 默认使用 dalli gem。而在 Rails 3 上,您需要像以前一样使用 :dalli_store 手动设置。
    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2018-04-29
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多