У меня есть приложение, которое много работает с большими списками данных в памяти.В настоящее время я использую структуру синглтона данных следующим образом:
public class DataCache {
private final Map<String, Map<String, ArrayList<String>>> arraysMap = new HashMap();
private final Map<String, Map<String, Integer>> integerMap = new HashMap();
private final Map<String, Map<String, String>> stringMap = new HashMap();
private final Map<String, Map<String, MyObject>> arraysMap = new HashMap();
/**
* Map for boolean locks used to temporaly disable
* edition while the data changes.
*/
private final Map<String, Map<String, Boolean>> locksMap = new HashMap();
private DataCache() {
}
private static final DataCache dataCache = new DataCache();
public static DataCache getInstanceOf() {
return dataCache;
}
...getters/setters...
}
arraysMap
и myObjectMap
получают большую часть рабочей нагрузки - что-то около 20-50 / с операций со списком, таких как put
/ replace
/ delete
и аналогичные для myObjectMap
(сумма для всех объектов).maps
доступны в многопоточном контексте.Первоначально такой нагрузки не ожидалось, но, похоже, она работает нормально.Однако, похоже, что сложность данных будет расти, как и нагрузка.
Вопрос - это - разумно ли переключиться на какое-то внешнее решение (redis
?) Или сохранения этой импровизации может быть достаточно.Нагрузка может увеличиться до максимум 500 операций в секунду на карту.Списки в arraysMap
могут достигать 200 МБ.