首页 / 缓存 / java – 基于时间戳的驱逐进行缓存
java – 基于时间戳的驱逐进行缓存
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 基于时间戳的驱逐进行缓存,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3099字,纯文字阅读大概需要5分钟。
内容图文
![java – 基于时间戳的驱逐进行缓存](/upload/InfoBanner/zyjiaocheng/794/2ada8ff18efb4ec9a1e78dd5b8545331.jpg)
我的服务端点每分钟收到一个度量列表及其时间戳.如果指标通过某些条件,我们需要将它们存储在缓存中,以便以后可以访问它们.该服务的访问功能是 –
List<Metrics> GetAllInterestingMetrics5Mins();
List<Metrics> GetAllInterestingMetrics10Mins();
List<Metrics> GetAllInterestingMetrics30Mins();
我的解决方案是使用3个番石榴缓存,基于时间的驱逐设置为5,10和10. 15分钟.当有人调用上述函数之一时,我会从relvant缓存中返回所有指标.
这有两个问题 –
>根据何时将值放入缓存(或访问,取决于设置),Guava缓存开始计时.现在可以延迟度量,因此时间戳将早于度量标准放入缓存的时间.
>我不喜欢我必须创建3个缓存,当一个30分钟的缓存应该足够时,它会增加内存占用和缓存处理的复杂性.
有没有办法在Guava或任何其他开箱即用的缓存解决方案中解决这两个问题?
解决方法:
关于主题1:
只是一个旁注:请不要混淆到期和驱逐.到期意味着该条目可能不再由缓存返回,并且可能在指定的时间点或持续时间之后发生.驱逐是释放资源的操作,该条目从缓存中删除.到期后,驱逐可能同时或稍后发生.
所有常见的缓存产品都不支持精确的,即“即时”,到期.我们在应用程序中经常需要这个用例,所以我花了一些努力用cache2k支持这个.
这是cache2k的蓝图:
static class MetricsEntry {
long nextUpdate;
List<Metrics> metrics;
}
static class MyEntryExpiryCalculator implements EntryExpiryCalculator<Integer, MetricsEntry> {
@Override
public long calculateExpiryTime(Integer _key, MetricsEntry _value, long _fetchTime, CacheEntry _oldEntry) {
return _value.nextUpdate;
}
}
Cache createTheCache() {
Cache<Integer, MetricsEntry> cache =
CacheBuilder.newCache(Integer.class, MetricsEntry.class)
.sharpExpiry(true)
.entryExpiryCalculator(new MyEntryExpiryCalculator())
.source(new MySource())
.build();
return cache;
}
如果您在metrics对象中有时间引用,则可以使用它,并且可以省略其他条目类. sharpExpiry(true)指示cache2k准确到期.如果你不这样做,到期时间可能会减少几毫秒,但访问时间会稍微快一些.
关于主题2:
直接的方法是使用间隔分钟作为缓存键.
这是一个缓存源(也就是缓存加载器),它严格返回前一个时间间隔的指标:
static class MySource implements CacheSource<Integer, MetricsEntry> {
@Override
public MetricsEntry get(Integer interval) {
MetricsEntry e = new MetricsEntry();
boolean crossedIntervalEnd;
do {
long now = System.currentTimeMillis();
long intervalMillis = interval * 1000 * 60;
long startOfInterval = now % (intervalMillis);
e.metrics = calculateMetrics(startOfInterval, interval);
e.nextUpdate = startOfInterval + intervalMillis;
now = System.currentTimeMillis();
crossedIntervalEnd = now >= e.nextUpdate;
} while (crossedIntervalEnd);
return e;
}
}
如果您按照10:07进行请求,那将返回10:00-10:05的指标.
如果您只想立即计算过去时间间隔的指标,那么它更简单:
static class MySource implements CacheSource<Integer, MetricsEntry> {
@Override
public MetricsEntry get(Integer interval) {
MetricsEntry e = new MetricsEntry();
long intervalMillis = interval * 1000 * 60;
long startOfInterval = System.currentTimeMillis();
e.metrics = calculateMetrics(startOfInterval, interval);
e.nextUpdate = startOfInterval + intervalMillis;
return e;
}
}
缓存源的使用优于put(). cache2k是阻塞的,因此如果有多个请求进入一个度量标准,则只启动一个度量标准计算.
如果您不需要精确到期毫秒,您也可以使用其他缓存.您需要做的是存储计算缓存值中的指标所花费的时间,然后相应地更正到期时间.
祝你有个好的一天!
内容总结
以上是互联网集市为您收集整理的java – 基于时间戳的驱逐进行缓存全部内容,希望文章能够帮你解决java – 基于时间戳的驱逐进行缓存所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。