我正在尝试将 Rails 请求缓存到需要 proc 的外部服务。
为了让我能够区分 2 个请求,proc 是 Rails 缓存键的一部分很重要。
但是,具有相同 proc 和 proc 代码中的值的多个请求每次仍会评估为不同的 proc 对象。
例如:
#<Proc:0x007ff6f675dd08@/Users/app/development/work/runner.rb:10>
#<Proc:0x007ff6ffb50790@/Users/app/development/work/runner.rb:10>
因此,即使对于相同的请求,我也会遇到缓存未命中。
如果 proc 在代码和变量值方面相同,我如何使用缓存键中的块/proc 计算结果相同。
服务调用类似于
def some_method
call_service do
a= 3;
b=6
end
end
def call_service(block)
Rails.cache.fetch(Date.today, block) {
external_service(&block)
}
end
I want to be able to compare blocks :
eg
{a=3, a*a} == {a=3, a*a} => True
{a=3, a*a} == {a=4, a*a} => false
{a=3, a*a} == {a=4, a*a*a} => False
我尝试使用,
block.source
RubyVM::InstructionSequence.of(block).disasm
但是它们都没有捕获块的状态,即变量的值(a = 3等)
在 rails 中实现这种缓存的最佳方法是什么?
PS:
使用 Rails4 和 reddis 作为缓存