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