java - 在设定的时间段后从缓存中删除项目?

标签 java caching hashmap iterator

我正在尝试创建一个保存 messageID 和 responsePayload(均为 bytes[])的缓存,并确保缓存中的每个项目在 5 秒后过期。这是我目前正在尝试做的事情。

我有以下类(class):

public class CacheObject {
    public byte[] responsePayload;
    public long time;

    public CacheObject(byte[] responsePayload) {
        this.responsePayload = responsePayload;
        this.time = System.currentTimeMillis();
    }
}

使用此类,我创建了以下缓存,其中 messageID 作为键,CacheObject 作为值

private static HashMap<byte[], CacheObject> cache = new HashMap<byte[], CacheObject>();

然后,每次循环程序的主要部分时,我都会调用一个函数:

private static void updateCache() {
    Collection times = cache.values();
    Iterator itr = times.iterator();

    while(itr.hasNext()) {
        CacheObject cacheObject = itr.next();
        if(System.currentTimeMillis() - cacheObject.time > 5000) {
            itr.remove();
        }
    }
}

但是我面临的问题是我似乎无法在这一行中将迭代器对象分配给我的 CacheObject:

CacheObject cacheObject = itr.next();

我看过一些建议这样做的帖子,但它似乎对我不起作用。有没有办法解决这个问题,或者有更好的方法来实现缓存删除?

最佳答案

不要使用原始类型!您收到该错误是因为您的迭代器类型不正确。将其声明为:

Collection<CacheObject> times = cache.values();
Iterator<CacheObject> itr = times.iterator();
<小时/>

编辑:

有一种更好的方法来实现 updateCache 方法:

private static void updateCache() {
    cache.values().removeIf(c -> System.currentTimeMillis() - c.time > 5000);
}

其中 c 的类型为 CacheObject,与 map 值的类型匹配。

检查Collection.removeIf方法文档以供进一步引用。

关于java - 在设定的时间段后从缓存中删除项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48394491/

相关文章:

java - 为什么 Eclipse Maven 说相同版本的依赖项有冲突?

java - Java HashMap 和我自己滚动的关键对象的问题

带有 Int 数组的 Java HashMap

integer - Json String包含整型值,反序列化为HashMap,Integer转为double值

java - 为什么JavaCC显示错误

Java/Mockito - 线程在重试之前以指数方式 hibernate 的单元测试

java - 在 Java 中开发自定义 GUI 生成器

javascript - 外部 CSS 和 JavaScript 文件不缓存?

php - 频繁使用网站的缓存策略

java - 我们如何将数据存储在应用程序范围内以用于缓存目的?