gpt4 book ai didi

java - 如何实现具有条目自动过期功能的CacheMap?

转载 作者:行者123 更新时间:2023-11-30 02:58:31 26 4
gpt4 key购买 nike

大家好,我想在java中实现缓存映射,其中映射条目在给定时间后过期。

我有这样的界面,我必须实现这些方法,但我不明白如何实际启动。

    public class CacheMapImpl implements CacheMap<Integer, String> {

@Override
public void setTimeToLive(long timeToLive) {


}

@Override
public long getTimeToLive() {

return 0;
}

@Override
public String put(Integer key, String value) {

return null;
}

@Override
public void clearExpired() {


}

@Override
public void clear() {


}

@Override
public boolean containsKey(Object key) {

return false;
}

@Override
public boolean containsValue(Object value) {

return false;
}

@Override
public String get(Object key) {

return null;
}

@Override
public boolean isEmpty() {

return false;
}

@Override
public String remove(Object key) {

return null;
}

@Override
public int size() {

return 0;
}

}

请告诉我如何实现这些方法,如何开始为我编写一点代码,请用代码更新我的缓存映射接口(interface)。

最佳答案

您必须使用相同的 key 管理内部 map 。使用 put 方法将新值添加到您的 map ,并为您的内部时间 map 添加一个值。您可以将 Long 存储为值,这是该值的具体时间。

然后,在后台启动一个新线程,该线程将始终检查内部映射中的所有键,并从内部映射和主映射中删除那些“旧”条目。

这是代码。正如我看到您的 Map 实现了一个接口(interface),其中提供了一些方法来清除过期值,我知道您不需要自动方法来删除过期值。所以,代码应该是这样的:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class CacheMapImpl implements CacheMap<Integer, String> {

private Map<Integer, Long> timesCache = new HashMap<Integer, Long>();
private Map<Integer, String> values = new HashMap<Integer, String>();

/** Time for the elemens to keep alive in the map in milliseconds. */
long timeToLive = 0;

@Override
public void setTimeToLive(long timeToLive) {
this.timeToLive = timeToLive;
}

@Override
public long getTimeToLive() {

return this.timeToLive;
}

@Override
public String put(Integer key, String value) {
values.put(key, value);
timesCache.put(key, System.currentTimeMillis());
return value;
}

@Override
public void clearExpired() {

// Just remove if timeToLive has been set before...
if (timeToLive > 0) {
List<Integer> keysToClear = new ArrayList<Integer>();
long currentTime = System.currentTimeMillis();

// Check what keys to remove
for (Entry<Integer, Long> e : timesCache.entrySet()) {
if ((currentTime - e.getValue().longValue()) > this.timeToLive) {
keysToClear.add(e.getKey());
}
}

// Remove the expired keys
for (Integer key : keysToClear) {
this.timesCache.remove(key);
this.values.remove(key);
}
}

}

@Override
public void clear() {
this.timesCache.clear();
this.values.clear();
}

@Override
public boolean containsKey(Object key) {

return this.values.containsKey(key);
}

@Override
public boolean containsValue(Object value) {

return this.values.containsValue(value);
}

@Override
public String get(Object key) {

return this.values.get(key);
}

@Override
public boolean isEmpty() {

return this.values.isEmpty();
}

@Override
public String remove(Object key) {
String rto = null;
if (containsKey(key)) {
this.values.remove(key);
this.timesCache.remove(key);
rto = key.toString();
}
return rto;
}

@Override
public int size() {

return this.values.size();
}

}

关于java - 如何实现具有条目自动过期功能的CacheMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36564256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com