Я хочу иметь кэш LRU (используя LinkedHashMap) в Avro, используя интерфейс карты Avro. Но я застрял в том, как инициализировать карту Avro с помощью LruCache
Вот моя реализация
LruCache. java
package a.b.c.d;
import java.util.LinkedHashMap;
import java.util.Map;
public class LruCache<K, V> extends LinkedHashMap<K, V> {
private int size;
public LruCache(int size) {
super(size, 0.75f, false);
this.size = size;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > size;
}
}
Lru.avdl
@namespace("a.b.c.d")
protocol LruProtocol {
record Lru {
map<int> lruMap = {};
}
}
LruWrapper. java
package a.b.c.d.e;
import a.b.c.d.Lru;
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.io.Encoder;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.reflect.ReflectDatumReader;
import org.apache.avro.reflect.ReflectDatumWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class LruWrapper {
private Lru lru;
private static final ReflectDatumReader<Lru> reader =
new ReflectDatumReader<>(Lru.class);
private static final ReflectDatumWriter<Lru> writer =
new ReflectDatumWriter<>(Lru.class);
public byte[] toBytes() {
ByteArrayOutputStream os = new ByteArrayOutputStream();
Encoder encoder = EncoderFactory.get().directBinaryEncoder(os, null);
try {
writer.write(lru, encoder);
encoder.flush();
return os.toByteArray();
} catch (IOException e) {
LOGGER.error("Failed to serialize Lru {}. Exception: ", lru, e);
return null;
}
}
public void fromBytes(byte[] bytes) {
try {
lru =
reader.read(
null,
DecoderFactory.get().directBinaryDecoder(new ByteArrayInputStream(bytes), null));
} catch (IOException e) {
LOGGER.error("Error loading lru from bytes", e);
}
}
}
Я застрял в том, как трактовать lruMap
как LruCache, так что при записи в avro поддерживается порядок записей в карте и во время чтение, карта читается как LruCache