2024 年 Clojure 调查! 分享您的想法。

欢迎!请参阅 关于 页面了解如何使用本站的相关信息。

+2
core.cache

TTLCacheQ 是基于 System/currentTimeMillis 构建的,它不是单调的,缓存的行为可能会受到时钟调整(例如 NTP)的影响。我的建议是将其改为 System/nanoTime,它单调,因此可以更一致地计算经过的时间。

如果希望这个时钟调整影响 TTL 缓存,可能需要将其变成另一种具有相关行为文档的缓存策略。

附言:我已经创建了一个 .patch 来修复这个问题,签署了 CA,但不知道在哪里申请 JIRA 账户以提交问题。

1 答案

0

这让我对仅切换到 nanoTime 感到有些担忧 https://www.geeksforgeeks.org/java-system-nanotime-vs-system-currenttimemillis/,但我理解为什么在某些边缘情况下可能使用 currentTimeMillis 也会有问题。

我为此创建了一个 https://clojure.atlassian.net/browse/CCACHE-62,但在采取任何行动之前需要仔细分析。合理的方法可能是添加一种新的基于使用 nanoTime 而不是 currentTimeMillis 的 TTL 缓存类型,而不是切换当前实现。

同意,因为两个计时器各有优缺点,使用System/nanoTime添加另一种TTL缓存将是最佳选择。

编辑
geeksforgeeks链接的信息似乎已经过时。其他来源,如https://stackoverflow.com/a/4588605https://stackoverflow.com/a/54566928,有更多细节。运行修补后的Java 8或更高版本似乎可以导致一致的System/nanoTime。这比System/currentTimeMillis好很多,后者可能在不出现JVM或OS错误的情况下是不一致的(对于TTL目的)。

我对任何一个解决方案都无所谓,只是分享数据。
谢谢,John。我回过头来将在核心缓存工作上进行阅读。
...