Ruby 记忆化是如何工作的?
How does Ruby Memoization work?
我听说过记忆的好处,但我不确定它是如何工作的。例如,在:
class User < ActiveRecord::Base
def twitter_followers
# assuming twitter_user.followers makes a network call
@twitter_followers ||= twitter_user.followers
end
end
据我所知,@twitter_followers
是一个实例变量,只会保留在一个请求的范围内(以便视图可以访问它。)
我不确定如果同一个用户刷新同一个页面,它是否会使用缓存的结果而不是触发查询。
您可以拥有 User
的实例并在不同的地方进行 user.twitter_followers
调用。
没有记忆意味着每次调用 user.twitter_followers
都会有新的 twitter_user.followers
请求,而使用记忆只会完成一个请求,并且每个后续调用都将使用 set @twitter_followers
变量。
So I am not sure if the same user refreshes the same page again will
it use the cached result instead of firing the query?
随着页面刷新,它将是新的请求。
在视图中,可以使用记忆化的优势,正如我的回答所暗示的,例如,如果您在这个页面中多次引用 user.twitter_followers
。
在 models/services/workers/any 其他具有记忆功能的后端相关地方确实有所不同。
首先它会触发查询,它作为用户模型实例的实例变量存储在内存中。用户模型的实例将始终根据请求重新加载。
我听说过记忆的好处,但我不确定它是如何工作的。例如,在:
class User < ActiveRecord::Base
def twitter_followers
# assuming twitter_user.followers makes a network call
@twitter_followers ||= twitter_user.followers
end
end
据我所知,@twitter_followers
是一个实例变量,只会保留在一个请求的范围内(以便视图可以访问它。)
我不确定如果同一个用户刷新同一个页面,它是否会使用缓存的结果而不是触发查询。
您可以拥有 User
的实例并在不同的地方进行 user.twitter_followers
调用。
没有记忆意味着每次调用 user.twitter_followers
都会有新的 twitter_user.followers
请求,而使用记忆只会完成一个请求,并且每个后续调用都将使用 set @twitter_followers
变量。
So I am not sure if the same user refreshes the same page again will it use the cached result instead of firing the query?
随着页面刷新,它将是新的请求。
在视图中,可以使用记忆化的优势,正如我的回答所暗示的,例如,如果您在这个页面中多次引用 user.twitter_followers
。
在 models/services/workers/any 其他具有记忆功能的后端相关地方确实有所不同。
首先它会触发查询,它作为用户模型实例的实例变量存储在内存中。用户模型的实例将始终根据请求重新加载。