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 文本:缓存奔袭),因为当 swap! 由于比较和交换失败而重试时,可能会多次调用 {{(retrieve-data key)}}。遗憾的是,我并没有关于如何解决这个问题的一些建议。

4 答案

0
by
 
最佳答案

这已在 org.clojure/core.cache "0.8.1" 中修复,添加了 clojure.core.cache.wrapped 命名空间,以及在該命名空间中的新 lookup-or-miss 函数。

0
by

评论者: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
参考:[CCACHE-50](https://clojure.atlassian.net/browse/CCACHE-50)(由 alex+import 报告)
...