RedisCacheManager не обновляет keyspace_misses - PullRequest
0 голосов
/ 26 апреля 2018

Я использую spring-boot spring-data-redis 1.8.9.RELEASE RedisCacheManager реализация CacheManager для кэширования.Одна метрика, в которую я хочу обратить внимание - это соотношение попаданий и промахов в кэше.Чтобы получить это, я извлекаю keyspace_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)));
}

Приведенный выше код будет выполнять эти команды при повторном просмотре с помощью MONITOR при пропадании кэша.Еще раз обратите внимание, что EXISTS выполняется в соответствии с кодом:

Redis commands executed for a cache miss

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

enter image description here

1 Ответ

0 голосов
/ 23 июля 2018

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

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