как получить количество значений в Redis хэш?

У меня есть хэш redis, например

key field value

1000 state "ca" 
1000 zip "95054"
2000 state "ca" 
2000 zip "95050"
3000 state "ny" 
3000 zip "12345"

Как я могу ответить на такие вопросы, как количество состояний "CA" . мне нужно сделать подсчет значений для поля. возможно ли это ? помощь будет оценена по достоинству.

- Avi

3 ответов


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

значение поля ключа команды

HSET 1000 состояние "ca"

HSET 1000 зип "95054"

INCR ca

HSET 2000 состояние "ca"

HSET 2000 zip "95050"

INCR ca

состояние HSET 3000 "Нью-Йорк"

HSET 3000 zip "12345"

INCR ny

Если вы хотите получить сколько хэш-Ключей с состоянием "ca", используйте:

получить ca


Я собираюсь предположить, что приведенные выше данные являются списком городов. Действительно, Вы могли бы рассмотреть возможность хранения этих, как...

key              value
city:1000:state  "ca"
city:1000:zip    "95054"
city:2000:state  "ca"
city:2000:zip    "95050"

теперь вернемся к вашему вопросу... В SQL вы можете сделать что-то вроде: выберите Count(*) из городов, где state='CA'. Или, может быть, если вы хотите подсчет для каждого штата... Выберите state, COUNT (*) из группы городов по состояниям.

на мой взгляд, это то, с чем Redis немного борется, но это дает вам возможность переосмыслить проектирования базы данных. Если вы планируете часто выполнять такой запрос, подумайте о создании нового отсортированного набора состояний. Счет будет ваш счет в этом случае. Использовать ZINCRBY в этом наборе (назовем его city_count_by_state) при добавлении/удалении записей в/из таблицы "города". Теперь ваш запрос что-то типа: ZRANK city_count_by_state 'CA'. Добавление/удаление / получение ранга в отсортированном наборе выполняется в O(log (n)) раз.

Если вы не хотите тратить память с отсортированным набором, вы можете использовать ключи чтобы вернуть большой список всех ваших ключей в городе "таблица". Затем ваша программа может автоматически перебирать эти ключи и подсчитывать, сколько городов имеют состояние "CA". Это немного ручного труда, но он все равно будет работать за o(n) времени.

Если у вас уже есть данные города, предварительно заполненные в вашей базе данных, вы можете создать свой отсортированный набор, используя ключи, а также (см. способ, описанный выше). Обнадеживающе это помогает!

посмотреть:


предполагая, что вы отвечаете за вставку значений в хэш, затем используйте MULTI/EXEC для обертывания хэш-вставок и соответствующих INCRS. Поэтому возьмите подход ptzOn, но не забудьте обернуть все это в MULTI/EXEC, чтобы иметь атомарную семантику. Сделайте то же самое при удалении хэша и используйте DECR.