我们最近将 core.cache 应用到了一个网络环境中,并发现了多线程访问的缓存雪崩现象。回顾起来很显然,但在文档中对雪崩的提及使我认为这已经被处理了。
在 Slack 的帮助下,我已经在这里重现了这个问题
(let [thread-count 20
cache-atom (-> {}
(cache/ttl-cache-factory :ttl 120000)
(cache/lu-cache-factory :threshold 100)
(atom))
latch (java.util.concurrent.CountDownLatch. thread-count)
invocations-counter (atom 0)]
(doseq [i (range thread-count)]
(println "starting thread" i)
(.start (Thread. (fn []
(cache-wrapped/lookup-or-miss cache-atom "my-key"
(fn [k]
(swap! invocations-counter inc)
(Thread/sleep 3000)
"some value"))
(.countDown latch)))))
(.await latch)
(deref invocations-counter))
我预计调用计数器的值应该是 1
,但实际上它是 20
(每个线程调用一次)。