LRU Cache в Авро - PullRequest
       39

LRU Cache в Авро

0 голосов
/ 01 апреля 2020

Я хочу иметь кэш 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

...