定期向ruby对象提取一些数据?

时间:2011-12-20 15:53:18

标签: ruby caching

我知道这看起来像个愚蠢的问题,但是我应该如何定期将某些数据提取到ruby对象?或尝试次数后,

让我说我有:

 @variable = SomeModel.all 

而且我不想一直拿取结果,所以我可以做

 @variable ||= SomeModel.all 

但是,如果不使用memcache或第三方解决方案,我应该如何每隔一段时间这样做?做这样的事情有什么棘手的方法吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

首先确保将@variable存储在可以持续数分钟的地方(即它不能是控制器实例变量,但它可能是某个模块的变量)。

接下来,保留一个DateTime对象,表示您上次更新变量的时间。每次要访问变量时,请检查DateTime是否超过10分钟。如果较旧,则更新变量和DateTime。

答案 1 :(得分:1)

未经测试的:

Cache ={}
def fetch(key, ttl)
  obj, timestamp = Cache[key]
  now = Time.now
  if obj.nil? || now - timestamp > ttl
    obj = yield
    Cache[key]=[obj, now]
  end 
  obj
end

用法:

variable = fetch(:variable, 10.seconds) { SomeModel.all }

如果nil也是有效值,则在从缓存中读取并更改if块时,只需使用默认的:no_value_stored作为默认值。

旁注:如果密钥太多,这个可能会炸毁你,因为哈希无限增长,所以你应该手动清理它或使用弱引用。