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 выполняется в соответствии с кодом:

Redis commands executed for a cache miss

После выполнения вышеуказанных команд keyspace_misses не увеличивается, даже несмотря на отсутствие промаха в кеше:

enter image description here

Ответ 1

Код, упомянутый в вопросе, является частью RedisCache, предоставленной Spring.

  1. Расширьте и создайте собственную реализацию класса RedisCache, чтобы переопределить поведение метода "get" в соответствии с вашими потребностями.
  2. Расширьте RedisCacheManager, чтобы переопределить метод "createRedisCache", чтобы использовать свой пользовательский RedisCache, созданный на первом шаге, вместо кеша по умолчанию.