Исключение кеша с несколькими ключами для одного значения - PullRequest
0 голосов
/ 26 апреля 2018

Предположим, у меня есть хранилище сеансов авторизации, реализованное как Cache<String, Session>, где Cache - это кеш Guava или что-то подобное, а Session - это какой-то картоподобный объект с данными сеанса. Предположим, что ключи - это строки sessionId, сгенерированные во время первоначальной аутентификации. Сам кэш имеет некоторую стратегию истечения срока действия, так что, например, после 30 м неактивности сеанс исключается и выполняется обратный вызов с двумя аргументами, ключ кеша и значение кеша которого равны , в конечном итоге , которое требует полной очистки.

Предположим, теперь я хочу сопоставить различные параметры входа одного и того же пользователя с одним и тем же sessionId. Например, последующий запрос может быть сделан с теми же учетными данными, которые должны быть разрешены для уже существующего сеанса, или может быть размещен запрос API, связанный с тем же пользователем, или браузер может запросить данные, используя идентификатор сеанса в своем cookie - все они должны разрешаться в один и тот же сеанс и идентификатор сеанса.

Одной из стратегий для реализации этого было бы сохранение Map<String, String> от исходного заголовка authorization (или некоторого его хеша) до sessionId и затем переход к исходному кешу. Это может быть простая карта, для которой пропущенное значение будет идентично ситуации, в которой есть значение, но нет соответствующего сеанса в кеше сеанса. Я мог бы в конечном итоге очистить все записи, совпадающие с идентификатором sessionId, когда вызывается обратный вызов истечения срока действия кэша сеанса. Это решение легко реализовать, но оно немного уродливо.

Другой стратегией, гораздо более привлекательной для , было бы использование оригинального заголовка authorization (или некоторого его хеша) вместе с sessionId в качестве ключа для указания кэша сеанса. к одному и тому же сеансу (поэтому несколько ключей, по крайней мере, два, указывают на одно и то же значение сеанса) Добавление данных является тривиальным, но удаление является сложным, поскольку все пары ключ-значение для одного и того же сеанса (значения) должны быть исключены одновременно, а обратный вызов должен быть вызван только один раз (так как некоторая логика завершения должна выполняться для сеанс, но только один раз).

Любое предложение для существующих библиотек кэширования, поддерживающих такую ​​функциональность, или любые идеи, как реализовать идею, например, наверху. Guava Cache или любое другое решение для кэширования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...