请在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
 
最佳答案

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

0

评论者:seancorfield

我花了一些时间找到这个建议的使用方法-- https://github.com/clojure/core.cache/wiki/Using

我应该更新到使用{{through-cache}},现在这更加通用

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

它还会有同样新潜在的缓存竞争问题,但至少与较新的API保持一致。

我怀疑使用本地{{delay}}可以缓解竞争问题,但这会使代码非常难以看懂,而且它不会很好地与{{through-cache}}配合工作--所以我需要深思。

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 报告)
...