2024 Clojure 状况调查中分享您的看法!

欢迎!请参阅关于页面了解有关此功能的更多信息。

0
core.cache
我在一些项目中使用了 core.cache。这是一个很棒的库,我非常喜欢它。但它缺少统计信息,所以我不能根据一些统计信息调整缓存的大小。我决定编写一个自定义的缓存实现,以便能够获取缓存的 hit/miss 统计信息。最初这是一个独立的项目,但我后来发现我需要在 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,它的唯一职责是返回 hit/miss 统计的快照。
* core.cache.stats.counters 命名空间提供了一个协议(StatsCounterProtocol),允许实现 hit/miss 计数器。已有两种实现:一种基于原子包装的长整型(long),另一种(默认使用)基于 LongAdder。
* 为所有可能调用的方法都提供了测试

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

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

合并前需要完成的事情

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

提前感谢您的反馈

10 个回答

0
by

评论者:seancorfield

这个想法非常有趣,谢谢!我确实认为这对很多{{core.cache}}用户(包括我自己)有很大的价值。

我将查看补丁,但在此期间,我未在贡献者页面上看到您的名字——您是否已经通过了这个流程?如果没有,请访问https://clojure.org/community/contributors

0
by

评论者:akhomchenko

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

0
by

评论者:seancorfield

谢谢。我明天会确认一下,因为网站有点延迟。

0
by

评论者:akhomchenko

你好。

关于贡献者页面还没有更新。我能帮点忙解决吗?

谢谢。

0
by

评论者:seancorfield

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

0
by

评论者:akhomchenko

哦,我主要问的是关于贡献者页面没有显示我的问题 :)

0
by

评论者:akhomchenko

添加了一些文档。

0

评论者:akhomchenko

大家好。关于这个问题有什么更新吗?我能做些什么来帮忙吗?谢谢

0

评论者:seancorfield

仍在考虑中。我在查看这个库的一批问题,并将这个问题作为其中一部分来处理,当我解决了其他难题时。

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