Теперь у нас есть интерфейс хранилища сообщений для хранения данных сообщения и запроса данных сообщения. Эти данные сообщения состоят из длинного ключа и тела байтового массива, как показано ниже:
public class Message {
//the key
private long t;
//the body
private byte[] body;
}
В этом интерфейсеметод put
с параметром Message используется для хранения данных, а getMessage
с ключом tmin и ключом tmax используется для запроса данных, код которого приведен ниже:
public interface MessageStore {
void put(Message message);
List<Message> getMessage(long tMin, long tMax);
}
Сначала этоПростая вещь для обработки данных и запросов, мы можем использовать Redis как стороннее хранилище БД, но дело в том, что мы не можем использовать сторонние хранилища БД в любом случае, например, Redis, MySQL, SQLite и т. д.
Кроме того, объем сообщения составляет около 50 байтов, а общее количество сообщений составляет около 200 миллионов, а объем составляет около 10 ГБ. Гораздо хуже, пространство кучи JVM составляет всего около 8 ГБ. Поэтому мы не можем загрузить все эти данные сообщения в память докера.
Поскольку производитель будет вызывать метод put
и метод getMessage
в нескольких потоках, поэтому в рамках указанных выше ограничений нам необходимо поместить этибыстро сообщения и запросить их быстро в поточно-безопасном режиме.
Для метода put
я думаю, что мы можем использовать MapedByteBuffer для быстрого сохранения данных сообщения в файл, потому что ключ данных сообщения приходит не по порядку, поэтому хранилище данных в файле будет смешанным,Эти смешанные данные недостаточно хороши для выполнения запросов.
Поскольку память Jvm недостаточно велика, поэтому я не могу использовать TreeMap
для хранения этих данных, в противном случае использование TreeMap
будет хорошим выбором. .
Есть идеи, как хранить данные в порядке и порядке для запросов?
Кажется, мне нужно записать локальную базу данных и продолжить .....