2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面,了解有关此如何工作的一些详细信息。

0 投票
core.cache
在我的项目中使用了一些 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)。已经有两种实现:一种是基于原子包装的 long,另一种(默认使用)是基于 LongAdder。
* 为所有可能调用的方法都提供了测试

注意事项(不分先后顺序)

* LongAdderStatsCounter 介绍了对 LongAdder 类的硬依赖,该类在 java 1.8 中添加。我尝试使其可选,但失败了(https://stackoverflow.com/questions/45045314/clojure-optional-definitions
* 我对 defcache 宏进行了修改(所有测试都通过),因此可以实际覆盖定义

合并前要完成的事情

* 如果您想提出想法,我会添加更多文档(也许我应该从这篇开始,这样被接受的可能性会更高?)
* 精炼代码(我根本不是 Clojure 专家),命名和命名空间

提前感谢您的反馈

10 答案

0 投票

评论者:seancorfield

这是一个很有趣的想法,谢谢!我肯定能看到这个对许多{{core.cache}}用户的价值(包括我自己)。

我会查看这个补丁,但在此期间,我没有在你的名字列在贡献者页面上——所以如果你还没有做,你能通过这个流程吗?https://clojure.org/community/contributors

0 投票

评论者:akhomchenko

我已经用我的电子邮件和github用户名签署了SLA。也许我做错了,我会再次检查。

0 投票

评论者:seancorfield

谢谢。由于网站延迟,我明天会和Alex确认。

0 投票

评论者:akhomchenko

大家好。

还在等待那个贡献者页面的更新。我能以某种方式帮助解决这个问题吗?

谢谢。

0 投票

评论者:seancorfield

我让Alex检查最近提交的CA——我期待他下周能确认。无论如何,我将需要一些时间来审查和分析补丁(我现在正忙于生产部署,所以请耐心等待)。

0 投票

评论者:akhomchenko

啊,我主要是为了贡献者页面没有显示我的问题而请求的:)

0 投票

评论者:akhomchenko

已添加一些文档。

0 投票

评论者:akhomchenko

您好。这个问题的更新吗?我能做些什么来帮助吗?谢谢

0 投票

评论者:seancorfield

仍在考虑中。我正在查看这个库的一些问题,并与解决其他困难问题时一同包括在内。

0 投票
参考: https://clojure.atlassian.net/browse/CCACHE-51 (由akhomchenko报告)
...