2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面以了解更多关于此功能的信息。

0
core.cache

我一直试图弄懂 core.cache,在我看来,文档中的建议使用,即

`
(defn get-data [key]
(cache/lookup (swap! cache-store

                   #(if (cache/has? % key)
                      (cache/hit % key)
                      (cache/miss % key (retrieve-data key))))
            key))

`

将会导致一个莲纹:https://en.wikipedia.org/wiki/Cache_stampede 文本:缓存奔溃),因为当由于 compare-and-swap 错误而导致 swap! 重试时,{{(retrieve-data key)}} 可能会被多次调用。不幸的是,我没有找到如何修复这一问题的建议。

4 答案

0
 
最佳答案

这已在 org.clojure/core.cache "0.8.1" 中修复,新增了 clojure.core.cache.wrapped 命名空间,特别是该命名空间中的新 lookup-or-miss 函数。

0

评论者:seancorfield

我花了很长时间才发现这个建议的使用 -- https://github.com/clojure/core.cache/wiki/Using

我应该更新它以使用 {{通过缓存}},这现在是更自然的了

(defn get-data [key] (cache/lookup (swap! cache-store cache/through-cache key retrieve-data) key))

它仍然存在缓存奔溃的可能性,但至少与较新的 API 一致。

我怀疑使用本地 {{延迟}} 可以减轻奔溃问题,但会使代码变得非常丑陋,并且它与 {{通过缓存}} 不兼容 -- 因此我需要思考。

0

评论者:seancorfield

本地 {{延迟}} 版本看起来是这样的

`
(defn get-data [key]
(let [data (delay (retrieve-data key)]

(cache/lookup (swap! cache-store cache/through-cache key (fn [_] @data)) key)))

`

0
参考资料: https://clojure.atlassian.net/browse/CCACHE-50 (由 alex+import 报告)
...