缓存API有些特殊。由于它们是不可变的缓存,任何通常会更改可变缓存中一些元数据(TTL,使用数据等)的操作都必须返回缓存的新实例。
在实际缓存API之上,还构建了一个“类似map”的API,以便您可以使用Clojure的get,assoc,dissoc操作在它们上操作。但是这个门面可以(并且确实)有一些奇怪的边缘情况,例如检查一个项目是否在缓存中然后再查找它(发现它已经“消失了”)——即使缓存本身是不可变的。这给上游消费者带来了问题,例如core.memoize必须包含spin/retry逻辑,以避免错误地返回nil。
这就是为什么我添加了提供更直观的“可变缓存”的 wrapped 命名空间(通过将不可变缓存包装在一个atom中),但这些缓存的安全API并不是真正的“类似map”:lookup-or-miss 是最安全的函数,它提供了一种避免竞争条件和重复执行的方式,同时仍然可以进行按需查找,如果需要,可以(重新)计算所需值。
在创建后使用新的值哈希表“初始化”缓存或“淘汰”操作固有地是修改操作。有一个类似map的get操作是一种便利,但只有当你乐于得到nil(或“缺失”值)时,如果你请求的缓存条目已过期。
如readme中所述:“core.cache API很难正确使用。”并且链接到了这个
文章,该文章讨论了将缓存当作“只是映射”来处理所产生的现场bug。