欢迎!请查看关于页面以了解更多如何使用本站的信息。
我一直在试图了解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)}}可能会多次调用。不幸的是,我没有提出任何修改建议。
这已在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保持一致。
我怀疑使用本地 {{delay}} 可以缓解踩踏问题,但这会导致代码非常丑陋,并且它不会很好地与 {{through-cache}} 配合 — 因此我需要对此进行一些思考。
本地 {{delay}} 版本看起来是这样的
`(defn get-data [key](let [data (delay (retrieve-data key)]
(cache/lookup (swap! cache-store cache/through-cache key (fn [_] @data)) key)))