Счетчик сгруппирован по категориям, авторам и датам в Redis

Я реализую систему, которая хранит большой объем данных в реляционной БД.

Данные могут быть классифицированы по категориям и иметь автора.

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

Система должна работать почти в режиме реального времени.

Например. (3 категории, 3 автора, 2 даты)

item1 category1 author1 2015-04-23
item2 category1 author2 2015-04-23
item3 category2 author1 2015-04-23
item4 category1 author1 2015-04-23
item5 category2 author2 2015-04-23
item6 category2 author2 2015-04-24
item7 category3 author1 2015-04-24
item8 category2 author3 2015-04-24
item9 category2 author2 2015-04-24

Полученные результаты:

2015-04-23:
    category1 author1: 2
    category1 author2: 1
    category1 author3: 0
    category2 author1: 1
    category2 author2: 1
    category2 author3: 0
    category3 author1: 0
    category3 author2: 0
    category3 author3: 0
2015-04-24:
    category1 author1: 0
    category1 author2: 0
    category1 author3: 0
    category2 author1: 0
    category2 author2: 2
    category2 author3: 1
    category3 author1: 1
    category3 author2: 0
    category3 author3: 0

Есть около 50 категорий и около 50 авторов.

Как можно смоделировать такое поведение в Redis?


person Garet    schedule 27.04.2015    source источник


Ответы (1)


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

Например, для первого элемента выполните:

HINCRBY 20150423 1:1 1
            ^    ^ ^ ^
      date -+    | | +- increment (static)
    category id -+ +- author id

Примечание. Я намеренно использовал более короткие идентификаторы для экономии оперативной памяти.

Чтобы получить данные для каждой даты, просто HSCAN соответствующий ключ (будьте осторожны с HGETALL, потому что это может занять слишком много времени). много времени/ОЗУ в зависимости от размера хэша). Чтобы получить все ключи даты, которые вы получаете, используйте либо SCAN (никогда не используйте KEYS), либо сохранить индекс дат в другой структуре данных (например, в наборе).

person Itamar Haber    schedule 27.04.2015
comment
Спасибо! Кажется разумным решением. Я новичок в Redis - person Garet; 28.04.2015