如何清除 Ruby 中的内存缓存?
How to clear memory cache in Ruby?
我是 Ruby 的新手。我有一个 rails 应用程序,我将站点配置(如站点名称)保存在数据库中。我已经设置了一个助手,所以我可以调用:site_param 'site_name'
。助手将数据存储在一个变量中,这样应用程序就不会在每次调用时都访问数据库,如下所示:
模块 SiteHelper
class 网站
def self.get(参数)
@params = {} 除非@params.kind_of?(哈希)
如果@params[param].nil?
new_param = Site.find(参数)
@参数[参数] = new_param
结尾
@参数[参数]
结尾
结尾
结尾
现在的问题是,一旦 @params
存储了一个值,它就不会在下一次请求时刷新。来自 php 背景,这种单例在每次请求时都会刷新,所以如果我在数据库上编辑一个值,它会毫无问题地刷新。在 ruby 中,@params
被缓存并保持相同的值,直到我重新启动服务器。有没有一种方法可以仅在请求生命周期内保留 @params
并在下一个生命周期内刷新?
您的代码的问题是您在 class 的上下文中使用实例变量,因此只要进程是 运行。
,它就会持续存在
您需要将#get
转换为实例方法,并重用Site
class 的实例。你在Ruby中写的绝对不是一个类似单例的实现。
module SiteHelper
def site
@site ||= Site.new
end
class Site
def get(param)
@params = {} unless @params.kind_of?(Hash)
if @params[param].nil?
new_param = Site.find(param)
@params[param] = new_param
end
@params[param]
end
end
end
# In the view
site.get("whatever")
您的代码也可以改进为更 ruby 风格。注意 #get
的实现,利用 ||=
和 return 值。
module SiteHelper
def site
@site ||= Site.new
end
class Site
def get(param)
@params ||= {}
@params[param] ||= Site.find(param)
end
end
end
我是 Ruby 的新手。我有一个 rails 应用程序,我将站点配置(如站点名称)保存在数据库中。我已经设置了一个助手,所以我可以调用:site_param 'site_name'
。助手将数据存储在一个变量中,这样应用程序就不会在每次调用时都访问数据库,如下所示:
模块 SiteHelper class 网站 def self.get(参数) @params = {} 除非@params.kind_of?(哈希) 如果@params[param].nil? new_param = Site.find(参数) @参数[参数] = new_param 结尾 @参数[参数] 结尾 结尾 结尾
现在的问题是,一旦 @params
存储了一个值,它就不会在下一次请求时刷新。来自 php 背景,这种单例在每次请求时都会刷新,所以如果我在数据库上编辑一个值,它会毫无问题地刷新。在 ruby 中,@params
被缓存并保持相同的值,直到我重新启动服务器。有没有一种方法可以仅在请求生命周期内保留 @params
并在下一个生命周期内刷新?
您的代码的问题是您在 class 的上下文中使用实例变量,因此只要进程是 运行。
,它就会持续存在您需要将#get
转换为实例方法,并重用Site
class 的实例。你在Ruby中写的绝对不是一个类似单例的实现。
module SiteHelper
def site
@site ||= Site.new
end
class Site
def get(param)
@params = {} unless @params.kind_of?(Hash)
if @params[param].nil?
new_param = Site.find(param)
@params[param] = new_param
end
@params[param]
end
end
end
# In the view
site.get("whatever")
您的代码也可以改进为更 ruby 风格。注意 #get
的实现,利用 ||=
和 return 值。
module SiteHelper
def site
@site ||= Site.new
end
class Site
def get(param)
@params ||= {}
@params[param] ||= Site.find(param)
end
end
end