Ahm*_*mad 2 java caching dictionary
大家好我想在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;
}
}
Run Code Online (Sandbox Code Playgroud)
请告诉我如何实现这些方法,如何开始为我编写一点代码,请用代码更新我的缓存映射接口。
您必须使用相同的密钥管理内部映射。使用您的 put 方法将新值添加到您的地图,并为您的内部时间地图添加一个值。您可以将 Long 存储为值,这是该值的具体时间。
然后,在后台启动一个新线程,该线程将始终检查内部映射中的所有键,并从内部映射和主映射中删除那些“旧”条目。
这是代码。当我看到您的 Map 实现了一个接口,其中提供了一些方法来清除过期值,我知道您不需要自动删除过期值的方法。所以,代码应该是这样的:
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();
}
}
Run Code Online (Sandbox Code Playgroud)