Я пытаюсь реализовать распределенный кеш с помощью spring-memcached
. Документы предполагают, что для использования объекта в качестве ключа мне нужно иметь метод в моем доменном классе с аннотацией @CacheKeyMethod на нем.
Но проблема в том, что я использую один и тот же класс домена в разных сценариях, и ключ, который должен быть сгенерирован в каждом случае, имеет разную логику. Например, для класса User
в одном из сценариев требуется, чтобы ключ был уникальным с точки зрения city
и gender
, а в другом случае он должен быть уникальным с точки зрения email
пользователя, по сути, это то, на чем основан ваш поиск.
Хотя электронная почта пользователя будет определять город и пол, поэтому я могу использовать электронную почту в качестве ключа и в первом случае, но это будет означать отдельные записи в кеше для каждого пользователя, в то время как кэшированные данные будут одинаковыми, пока пол и город одинаковы , что, как ожидается, значительно увеличит коэффициент попаданий (просто подумайте, сколько пользователей, которых вы можете ожидать, будут мужчинами из Бангалора).
Есть ли способ определить разные ключи. Также было бы здорово, если бы логика генерации ключа могла быть выведена из самого доменного класса.
Я прочитал документацию и понял, что что-то под названием CacheKeyBuilder
и/или CacheKeyBuilderImpl
может помочь, но я не мог понять, как действовать дальше.
Редактировать.. хорошо.. У меня есть одна подсказка! Что делает CacheKeyBuliderImpl, так это то, что он вызывает метод generateKey для экземпляра defaultKeyProvider, который ищет @cachekeyannotation в предоставленных методах класса домена и выполняет найденный метод для получения ключа.
Таким образом, замена либо CacheKeyBuilderImpl
на собственный Impl, либо замена реализации KeyProvider
по умолчанию в CacheKeyBuilderImpl на вашу может помочь... но ссылка на поставщика ключей жестко связана с DefaultKeyProvider.
Может ли кто-нибудь помочь мне реализовать CacheKeyBuilder (в отношении того, что делают разные методы; документация не разъясняет это), а также как мне внедрить его для использования вместо обычного CacheKeyBuilderImpl