• Актуальность данных при кэшировании, решается ли?

    @TochnoNeVadim Автор вопроса
    За 11 часов рассмотрели подобный вариант, для того чтобы можно было сбросить кэш пользователя из-за изменения рамки администратором. Кажется максимально правильным, но сомнения огромные:

    Когда user:user_id попадает в Redis - делаем запись в:
    frames:at_user:user_id - отдельно сохранённый ID рамки пользователя.
    frames:at_users:frame_id - SET список с ID пользователей, у которых эта рамка есть.

    Когда user:user_id удаляется из Redis (del / expired), смотрим - существует ли frames:at_user:user_id. Если существует, то удаляем и его, и удаляем ID пользователя из SET-а frames:at_users:frame_id.

    Итог:
    При любом обновлении рамки, мы уже можем узнать у каких user-ов она есть (из тех кто в кэше) по SET-у frames:at_users:frame_id и зачистить его параллельно кэшу каждого юзера.

    ----------------

    Кажется что это максимально правильный вариант на тот момент, когда администратор обновит изображение рамки. Есть возможность составить точный список ключей, которые надо очистить. И это число не превысит кол-во юзеров в кэше.

    Но тогда мы будем постоянно генерировать и оперировать кучей данных, которые возможно не пригодятся месяц или два. Администратор может играться с рамками по 50 раз на дню, а может забыть про них на месяцы.

    Описанное после разделителя - скорее философский вопрос. И ко всему, это не решает изначальный затык с тем, что обновление рамки по итогу должно привести к инвалидации кэша выборки тикетов.

    ---------------

    UPDATE

    В целом, поковыряв ещё немного, решение в этом комментарии можно заменить используя RedisJSON и RediSearch. Накинуть индексы на поля пользователя, и потом вытянуть те ключи - которые нужно дропнуть.

    FT.CREATE idx:user
    ON JSON PREFIX
    1 "users:id:"
    SCHEMA
    $.frame.id AS frame_id NUMERIC


    FT.SEARCH idx:user "@frame_id:[13 13]"


    В данный момент предполагаю что это решение можно применить для всей проблемы.
    Ответ написан
    Комментировать