我知道这看起来像个愚蠢的问题,但是我应该如何定期将某些数据提取到ruby对象?或尝试次数后,
让我说我有:
@variable = SomeModel.all
而且我不想一直拿取结果,所以我可以做
@variable ||= SomeModel.all
但是,如果不使用memcache或第三方解决方案,我应该如何每隔一段时间这样做?做这样的事情有什么棘手的方法吗?
谢谢。
答案 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
作为默认值。
旁注:如果密钥太多,这个可能会炸毁你,因为哈希无限增长,所以你应该手动清理它或使用弱引用。