RedisCacheManager не обновляет keypace_misses
Я использую spring-data-redis весенней загрузки 1.8.9.RELEASE Реализация RedisCacheManager для CacheManager для кэширования. Один показатель, который я хочу видеть, - это отношение кэш/провал кеша. Чтобы получить это, Im извлекает keypace_hits и keyspace_misses, открытые через redis-сервер, который также можно просмотреть через redis_cli с помощью INFO STATS
. Проблема заключается в том, что RedisCacheManager никогда не регистрирует промахи в кеше, т.е. keyspace_misses никогда не увеличивается, даже если есть "промах" кеша.
Отлаживая код, я вижу, что функция spring-data-redis проверяет, проверяет ли ключ EXISTS
в redis перед его извлечением. Я вижу смысл с этим подходом, однако, когда EXISTS
выполняется против сервера redis, он не регистрирует пропуски кеша.
Есть ли способ использовать RedisCacheManager и пропустить пропуски кеша регистрации? Я знаю, что могу использовать другие объекты redis для этого, но мне было интересно, можно ли это сделать со стандартной реализацией CacheManager?
редактировать
Идеальное решение не добавит больших накладных расходов, и я не могу отредактировать конфигурацию сервера redis.
Код, который RedisCacheManager использует при извлечении элемента из кеша. Уведомление Boolean exists
:
public RedisCacheElement get(final RedisCacheKey cacheKey) {
Assert.notNull(cacheKey, "CacheKey must not be null!");
Boolean exists = (Boolean)this.redisOperations.execute(new RedisCallback<Boolean>() {
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
return connection.exists(cacheKey.getKeyBytes());
}
});
return !exists ? null : new RedisCacheElement(cacheKey, this.fromStoreValue(this.lookup(cacheKey)));
}
Вышеупомянутый код будет выполнять эти команды, если redis можно просмотреть через MONITOR
при пропуске кеша. Еще раз обратите внимание, что EXISTS
выполняется в соответствии с кодом:
После выполнения вышеуказанных команд keyspace_misses
не увеличивается, даже несмотря на отсутствие промаха в кеше:
Ответы
Ответ 1
Код, упомянутый в вопросе, является частью RedisCache, предоставленной Spring.
- Расширьте и создайте собственную реализацию класса RedisCache, чтобы переопределить поведение метода "get" в соответствии с вашими потребностями.
- Расширьте RedisCacheManager, чтобы переопределить метод "createRedisCache", чтобы использовать свой пользовательский RedisCache, созданный на первом шаге, вместо кеша по умолчанию.