我有一个用户'通知'的应用程序认为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发出新请求。还有其他方法可以实现吗?
答案 0 :(得分:1)
首先使用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 Etags
或Fragment 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值也会发生变化。从而导致缓存过期。现在,缓存是一个广泛的主题,涵盖&有各种各样的技术来做到这一点。所以我不会给你一个完整的答案,但我会指出以下资源,以便你可以了解更多:
快乐缓存; - )