我想了解使用Rails.cache.fetch
時Rails中的race_condition_ttl
指令。瞭解Rails中的race_condition_ttl
我有一個控制器的動作,看起來像這樣:
def foo
@foo = Rails.cache.fetch("foo-testing", expires_in: 30.seconds, race_condition_ttl: 60.seconds) do
Time.now.to_s
end
@foo # this gets used in a view down the line...
end
基於什麼我讀了Rails的文檔,此值應在30秒後到期,但陳舊的值允許服務再過60秒。但是,我無法弄清楚如何重現那些能夠讓我看到這種行爲有效的條件。這是我試圖測試它的方式。
100.times.map do
t = Thread.new { RestClient.get("http://myenvironment/foo") }
t
end.map {|t| t.join.value }.uniq
我有我的Rails應用程序在標準nginx /獨角獸設置後面的虛擬機上運行。我試圖同時產生100個線程同時模擬「狗樁效應」。但是,當我運行我的測試代碼時,所有線程都返回相同的值。我期望看到的是一個線程得到了新的價值,而另一個線程得到了一些陳舊的內容。
任何指針都歡迎!非常感謝。
試試'Time.now.to_f'或'SecureRandom.uuid'。默認情況下'Time.now.to_s'只准確到一秒鐘,所以很可能,即使它確實不同,你也不會注意到,因爲它穩定得這麼快。 – tadman
@tadman謝謝,讓我試試。 – bitops
@tadman通過使用更精細的值,我確實看到了一些差異。我會看看這個主題中的其他答案,看看我能否獲得更多的理解。謝謝! – bitops