我在我的某些项目中使用了 core.cache。这是一个很棒的库,我非常喜欢它。但它唯一缺少的是统计数据,因此我可以根据某些统计数据来调整缓存的大小。我决定编写一个自定义的缓存实现,该实现在缓存上可以获取命中/未命中统计数据。起初它是一个独立的项目,但后来我意识到我需要在 core.cache 本身中进行一个更改,而这不是很好地进行破解。因此,这里有一个补丁来添加具有统计功能的缓存实现。
快速演示
{code:none}
(require '[clojure.core.cache :as core.cache]
'[clojure.core.cache.stats :as ccs]
'[clojure.core.cache.stats.counters :as ccs.counters])
(def cache (-> {} core.cache/lru-cache-factory ccs/measured-cache))
(ccs/stats cache) ; {:hit 0, :miss 0, :request 0, :hit-ratio 1.0, :miss-ratio 1.0}
(def cache (assoc cache :foo "bar"))
(ccs/stats cache) ; {:hit 0, :miss 1, :request 1, :hit-ratio 0.0, :miss-ratio 1.0}
(get cache :foo) ; "bar"
(get cache :foo) ; "bar"
(ccs/stats cache) ; {:hit 2, :miss 1, :request 3, :hit-ratio 0.6666666666666666, :miss-ratio 0.3333333333333333}
新增功能
* core.cache.stats 命名空间提供了实现了 CacheProtocol 的 MeasuredCache 以及一个用于实例化它的 measured-cache 函数。MeasuredCache 还实现了 MeasuredCacheProtocol,其唯一职责是返回命中/未命中统计数据的快照。
* core.cache.stats.counters 命名空间提供了一个协议(StatsCounterProtocol),它允许实现命中/未命中计数器。目前已有两个实现:一个是基于原子包裹的长整型,另一个(默认使用)是基于 LongAdder
* 对所有可调用的方法都有测试
注意事项(无特定顺序)
* LongAdderStatsCounter 引入了对 LongAdder 类的强制依赖,该类是从 Java 1.8 中添加的。我尝试使其可选,但失败了(
https://stackoverflow.com/questions/45045314/clojure-optional-definitions)
* 我修改了 defcache 宏(所有测试都通过),这样我实际上可以覆盖定义
合并前需要完成的任务
* 如果您想添加更多文档(也许我应该先写这个,这样更容易被接受?)
* 精简代码(我根本不是 Clojure 专家),命名和命名空间
提前感谢您的反馈