2012-02-09 1 views
1

Насколько точна команда dbsize в redis?Точность команды redis dbsize

Я заметил, что количество ключей, возвращаемых dbsize, не соответствует количеству фактических ключей, возвращаемых командой keys.

Вот пример:

redis-cli dbsize 
(integer) 3057 
redis-cli keys "*" | wc -l 
2072 

Почему dbsize намного выше, чем фактическое количество ключей?

+1

Вы исчерпали свои ключи? Одно из отличий: dbsize просто возвращает количество ключей в главном словаре, не исключая истекшие ключи, тогда как команда ключей систематически проверяет, истек ли данный ключ, прежде чем возвращать его. –

+0

Да, я истекаю свои ключи. Так что это объясняет. Если вы представите это в качестве ответа, я соглашусь с ним. Благодаря! –

ответ

2

Я бы сказал, что это связано с истечением срока действия ключа.

Хранилища ключей/значений, такие как Redis или memcached, не могут позволить определить физический таймер на каждый объект до истечения срока действия. Их было бы слишком много. Вместо этого они определяют структуру данных, чтобы легко отслеживать элементы, срок действия которых истек, и мультиплексировать все события истечения срока действия на один физический таймер. Они также склонны реализовывать ленивую стратегию борьбы с этими событиями.

С Redis, когда товар истекает, ничего не происходит. Однако перед доступом к каждому элементу систематически выполняется проверка, чтобы избежать возврата истекших элементов и потенциально удалить элемент. Вдобавок к этой ленивой стратегии каждые 100 мс, алгоритм улавливателя запускается для физического истечения нескольких элементов (т. Е. Удаляет их из основного словаря). Количество рассмотренных ключей на каждой итерации зависит от рабочей нагрузки истечения (алгоритм является адаптивным).

В результате у Redis может быть отставание предметов, срок действия которых истекает в данный момент времени, когда у вас есть постоянный поток событий истечения.

Теперь, возвращаясь к вопросу, команда DBSIZE просто возвращает размер основного словаря, поэтому включает истекшие элементы, которые еще не удалены. Команда KEYS просматривает весь словарь, обращаясь к отдельным клавишам, поэтому исключает все истекшие элементы. Поэтому количество элементов может не совпадать.