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 文本:缓存雪崩),因为如果由于比较和交换失败而重试时,{{(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保持一致。

我怀疑使用本地 {{delay}} 可以缓解踩踏问题,但这会导致代码非常丑陋,并且它不会很好地与 {{through-cache}} 配合 — 因此我需要对此进行一些思考。

0
by

由seancorfield发表评论:

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

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

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

`

0
by
参考: https://clojure.atlassian.net/browse/CCACHE-50 (由 alex+import 提出)
...