嘿所有,如果您曾在[craigslist]上发帖,这个问题应该对您有意义。每当您发布商品(例如,出售家具或公寓)时,您的商家信息不会立即被列入网站。相反,列表将每10-15分钟分批出现(数量不同)。起初我真的过度思考这种行为,试图保存记录然后进行批量插入,但我意识到它更简单。在与一些同事交谈之后,Craigslist正在缓存他们的页面,然后每隔10-15分钟清空一次缓存。这严重降低了数据库的负载。
现在,我的问题。我如何在Rails中完成同样的事情?我知道如何实现缓存 - 我已经阅读了[使用Rails指南进行缓存]。我将使用动作缓存和片段缓存(因为我无法缓存整个页面)。我仍然需要进行验证和访问控制,因此我无法完全缓存页面...
答案 0 :(得分:5)
要实现定时页面缓存,您可以使用标准的Rails缓存加上一点时间的聪明。
首先,您要确定缓存级别。你有三个选择:
然后,您需要选择适当级别的缓存并在您的应用中实现(请查看上面的链接以获取实施示例)。
一旦实现了缓存,您现在必须找到一种使缓存过期的方法。我可以想到两种方法来做到这一点,都有好处和缺点。现在让我们假设你选择使用动作缓存。
可靠但更具参与性 - 在控制器中创建一个过期缓存的操作和一个对该操作发出请求的cron作业任务。我问了一个类似的问题来解决这个问题'built in' scheduled task。对于安全预防措施,您可能希望包含生成的哈希值或类似内容,以便有人无法通过转到'/ products / expire_cache'手动使缓存过期。
class ProductsController < ApplicationController
caches_action :index
def index
# implementation
end
def expire_cache
if params[:verification_hash] == 'sa89sf8sfsfehiwaf89yfea98fh'
expire_action :action => :index
end
end
end
不可靠但更容易 - 只需使用任意条件使您的操作中的缓存失效。此实现假设将有足够的流量来定期确保有人将在0,15,30和45分钟内访问您的站点。您可以减少此间隔,以确保以更可能的间隔重置缓存。
class ProductsController < ApplicationController
caches_action :index
def index
# implementation
expire_action :action => :index if Time.now.min % 15 == 0
end
end
答案 1 :(得分:0)
我认为您想要实现的目标有两种方法:
答案 2 :(得分:0)
caching in Rails的最简单方法可能是使用Memcached :expires_in
选项。
您可能需要一台VPS服务器来使用它,这对于较小的站点来说可能很昂贵。
但即使没有memcached,你也可以做好基于时间的缓存。这个小SimpleCache代码段为我的共享托管网站创造了奇迹。