欢迎!请参阅关于页面以了解此工作方式的更多信息。
我一直试图理解 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)}}。遗憾的是,我并没有关于如何解决这个问题的一些建议。
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)))