Предположим, мне нужно сделать кеш лайков пользователей, так как многие пользователи могут нажать кнопку «Нравится» или «Не нравится» за короткий период времени.
Моя идея состоит в том, чтобы создать таблицу mysql с полями, включая user_id , Like_object_id, Like_object_type, create_time и (user_id, Like_object_id, Like_object_type) в качестве составного ключа. Когда пользователь нажимает кнопку лайка, вставляет запись в таблицу, а когда пользователь отменяет лайк, удаляет строку из таблицы. Эта таблица mysql предназначена для сохранения данных.
И затем вставьте redis, когда пользователь нажимает кнопку Like, сначала добавьте объект ha sh в базу данных redis и поместите ключ этого ha sh в набор под названием "cached_keys", так что я могу легче захватить эти объекты ha sh. Если пользователь отменяет подобное, то ключ отмененного объекта ha sh перемещается из «cached_keys» в другой набор под названием «deleted_keys», в котором находятся все отмененные ключи лайков. Почему я делаю это, я могу отслеживать, какие лайки объект добавляется или удаляется, когда я записываю все данные в redis обратно в таблицу mysql через определенный период времени. За исключением того, что сохраняется до mysql, я только запрашиваю и пишу в redis.
Есть и другие проблемы. Лайк запрашивает все лайки определенного типа объекта и одного пользователя. для этого мне нужно создать множество наборов redis, пространство имен которых объединяет object_type и user_id, и сохранить все соответствующие object_id в наборе и изменить их вместе с другим набором, таким как «cached_keys» и «deleted_keys». Другой подобный случай - запрос всех пользователей, которым понравился определенный объект.
Другая проблема - запрос на соединение. Поскольку данные кэшируются в Redis, сложно выполнять запросы на постраничное соединение с таблицей mysql лайков, например, запрашивать список объектов, сортировать по нему, как по количеству. Мне нужно получить все объекты из mysql в память, затем получить количество лайков из redis и отсортировать их, а затем просмотреть результаты. И если я хочу сделать какой-то запрос одного типа объектов, который понравился одному пользователю, я должен получить все ключи из redis и использовать «IN».
Делать это так, кажется неправильным способ сделать это. Каждый раз, когда происходит сохранение, он будет записывать все записи в базу данных сразу, не похоже, что он может хорошо масштабироваться, как и запрос соединения.
Как я могу это улучшить, или лучше сделать это по-другому? Большое спасибо.