欢迎!请参阅关于页面了解有关此功能的更多信息。
我一直试图了解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
我应该更新到使用{{through-cache}},现在这更加通用
(defn get-data [key] (cache/lookup (swap! cache-store cache/through-cache key retrieve-data) key))
它还会有同样新潜在的缓存竞争问题,但至少与较新的API保持一致。
我怀疑使用本地{{delay}}可以缓解竞争问题,但这会使代码非常难以看懂,而且它不会很好地与{{through-cache}}配合工作--所以我需要深思。
本地 {{延迟}} 版本将看起来像这样
`(defn get-data [key](let [data (delay (retrieve-data key)]
(cache/lookup (swap! cache-store cache/through-cache key (fn [_] @data)) key)))