Поддержание синхронизации потока операций Redis с исходным источником данных
У меня есть поток активности в моем веб-приложении, в котором используется настройка, почти идентичная описанной здесь: Как реализовать поток активности в социальной сети
Вкратце: структура данных в настоящее время состоит только из одной длинной денормализованной таблицы MySQL.
Вышеприведенный пост также предлагает возможность использования Redis в качестве кэша для последних 100 или около того действий для каждого пользователя. Я уже начал разрабатывать это таким образом, чтобы у каждого пользователя был список Redis с именем что-то вроде "uid:123:activity", а каждый элемент списка - это PHP-массив в формате json, сохраненный в виде строки. JSON содержит информацию, такую как "user_id", "time", "photo_id" и т. Д.
Тем не менее, я, кажется, столкнулся с проблемой. Как я могу удалить действия из списка пользователей в Redis, если один из участников этого действия удален из приложения? Например, если кто-то, за кем вы следите, удаляет свою учетную запись, любые действия, связанные с ним, должны быть удалены из вашего потока. Я вижу два возможных подхода, ни один из которых не кажется фантастическим:
- Каждый раз, когда что-то удаляется, просматривайте все списки пользователей и элементы списка в поисках ссылок на него и, если оно существует, удалите его. (Это, вероятно, нереально)
- При создании Steam из списка, проверьте, существует ли элемент, и если он не обязательно удалить этот элемент из списка.
Многие люди предлагают использовать Redis для потоков деятельности, структурированных подобным образом, но я не видел проблемы синхронизации списка с исходным адресом источника.
Есть ли у кого-нибудь еще предложения, прежде чем я пойду по маршруту варианта 2?
1 ответ
Я один из авторов Stream-Framework и getstream.io. Наиболее распространенным подходом является:
1.) Fanout удаляет и удаляет их из каждого канала, а также:
2.) Добавить слой фильтрации во время чтения
Этот второй шаг полезен в случае, если люди отправляют недопустимый контент, у вас есть расширенные настройки конфиденциальности или по какой-то другой причине вы хотите быстро удалить данные.