- import org.junit.jupiter.api.Assertions;
- import org.junit.jupiter.api.Test;
- import java.util.HashMap;
- import java.util.LinkedHashMap;
- import java.util.Map;
- public class KeyValueStoreWithTime {
- private final Map<String, String> kv = new HashMap<>();
- private final LinkedHashMap<Long, Integer> getMetrics = new LinkedHashMap<>();
- private final LinkedHashMap<Long, Integer> putMetrics = new LinkedHashMap<>();
- private final int interval = 300;
- public String get(String key, long currentTime) {
- String value = kv.get(key);
- // long currentTime = System.currentTimeMillis() / 1000;
- getMetrics.merge(currentTime, 1, Integer::sum);
- truncateMetricsMap(getMetrics, currentTime, interval);
- return value;
- }
- public void put(String key, String value, long currentTime) {
- kv.put(key, value);
- // long currentTime = System.currentTimeMillis() / 1000;
- putMetrics.merge(currentTime, 1, Integer::sum);
- truncateMetricsMap(putMetrics, currentTime, interval);
- }
- public int getMetrics() {
- return getMetrics.values().stream().mapToInt(Integer::intValue).sum();
- }
- public int putMetrics() {
- return putMetrics.values().stream().mapToInt(Integer::intValue).sum();
- }
- private void truncateMetricsMap(LinkedHashMap<Long, Integer> metricsMap, long currentTime, int interval) {
- metricsMap.entrySet().removeIf(longIntegerEntry -> longIntegerEntry.getKey() < currentTime - interval);
- }
- @Test
- public void testKeyValueStoreWithTime() {
- put("1", "v", 1);
- put("2", "v", 100);
- put("3", "v", 200);
- put("4", "v", 200);
- put("5", "v1", 400);
- put("5", "v2", 400);
- put("6", "v", 500);
- Assertions.assertEquals(5, this.putMetrics());
- }
- }
复制代码 我的想法是用一个LinkedHashMap记录put和get操作的次数,因为Java 的LinkedHashMap是按照key的插入时间有序的,每次put/get操作完,只要遍历一下这个LinkedHashMap,把300s之前的记录全部删掉。需要返回put/get统计的时候,把这个LinkedHashMap的值sum一下即可
觉得有帮助请加点米 |