欢迎!请参阅关于页面以了解更多关于此功能的信息。
我一直试图弄懂 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)}} 可能会被多次调用。不幸的是,我没有找到如何修复这一问题的建议。
swap!
这已在 org.clojure/core.cache "0.8.1" 中修复,新增了 clojure.core.cache.wrapped 命名空间,特别是该命名空间中的新 lookup-or-miss 函数。
org.clojure/core.cache
clojure.core.cache.wrapped
lookup-or-miss
评论者: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 一致。
我怀疑使用本地 {{延迟}} 可以减轻奔溃问题,但会使代码变得非常丑陋,并且它与 {{通过缓存}} 不兼容 -- 因此我需要思考。
本地 {{延迟}} 版本看起来是这样的
`(defn get-data [key](let [data (delay (retrieve-data key)]
(cache/lookup (swap! cache-store cache/through-cache key (fn [_] @data)) key)))