Я разрабатываю систему кэширования данных, в которой одновременно может храниться очень большое количество записей, и мне нужно знать, какой stl-контейнер использовать и как его использовать. Приложение заключается в том, что у меня есть чрезвычайно большая база данных записей для пользователей - когда они входят в мою систему, я хочу извлечь их запись и кэшировать некоторые данные, такие как имя пользователя и несколько важных свойств. Когда они взаимодействуют с системой, я обновляю и получаю доступ к их свойствам. Некоторые свойства очень изменчивы, и я делаю это, чтобы избежать «ударов» по БД со многими транзакциями. Кроме того, мне редко нужно использовать базу данных для сортировки или чего-то еще - я использую это так же, как прославленный двоичный файл сохранения (поэтому я счастлив кэшировать записи в памяти ..); более важной целью для меня является возможность масштабирования для огромного количества пользователей.
Когда пользователь выходит из системы, сервер выключается или периодически в циклическом режиме (на всякий случай...), я хочу записать его данные обратно в БД.
Сервер хранит свои:
vector <UserData *> loggedInUsers;
С UserData сохраняются такие вещи, как имя пользователя (строка) и другие свойства из БД, а также другие временные данные, такие как сетевые дескрипторы.
Мой первый вопрос: если мне нужно найти конкретного пользователя в этом векторе, какой самый быстрый способ сделать это и есть ли другой контейнер stl, который я могу использовать, чтобы сделать это быстрее? Что я делаю сейчас, так это создаю итератор, запускаю его в loggedInUsers.begin() и итерирую до .end(), проверяя *iter->username == "foo" и возвращаясь, когда он найден. Если имя пользователя находится в конце вектора или если в векторе 5000 пользователей, это значительная задержка.
Мой второй вопрос: как я могу циклически планировать запись этих данных обратно в БД? Я могу вызывать функцию каждый раз, когда я готов записать несколько записей в БД. Но я не могу удерживать итератор в векторе, потому что он станет недействительным. Что я хотел бы сделать, так это иметь вращающуюся очередь, где я могу получить доступ к голове очереди, сохранить ее в БД, а затем повернуть ее, чтобы она стала концом очереди. Это похоже на много накладных расходов... какой тип я мог бы использовать, чтобы сделать это лучше?
Мой третий вопрос заключается в том, что я использую сервер MySQL и коннектор libmysqlclient / C. Есть ли какое-либо встроенное кэширование, которое могло бы решить эту проблему «бесплатно», или есть вообще другой метод? я открыт для предложений