2015-10-28 2 views
6

TL; DR Я ищу способ хранения, увеличения и извлечения диапазонов событий по минутам.Как увеличить значение сортированного набора redis

Я ищу решение для создания дополнительных периодов времени в redis. Я ищу, чтобы хранить счета до минуты. Моя цель - найти временной диапазон и получить значения. Поэтому для instnace, если событие произошло для определенного ключа 30 раз в минуту. Я хотел бы сделать что-то вроде zrange и получить их ключевые значения. Я также надеюсь использовать что-то вроде zincrby для увеличения значения. Я, конечно, посмотрел на сортированный набор, который казался бы идеально подходящим, пока я не понял, что я могу делать только сканирование диапазона, но не значение. Оптимальным решением было бы использовать количество минут в качестве оценки, а затем использовать значение в отсортированном наборе как количество событий за эту минуту. Проблема, с которой я столкнулся, - это zincrby только увеличивает счет, а не значение. Мне не удалось найти способ увеличить значение атомарно. Я также посмотрел на хэш-карту, используя текущую минуту, поскольку ключ и событие подсчитываются как значение. Я смог увеличить значение с помощью hincrby, но проблема в том, что он не поддерживает выбор диапазона ключей.

Любая помощь будет оценена по достоинству.

ответ

4

Знаете ли, у вопроса уже есть ответ. И вы уже говорите о redis, чтобы решить вашу проблему:

  1. Используйте ZSET - ключ как время и значение как счетчик.
  2. Используйте HSET - ключ как время и значение в качестве счетчика.
  3. Использовать string keys - ключевое слово как время и значение как счетчик.

Почему только эти случаи - becouse только из этих структур (ZSET, HSET и string keys) имеет атомные методы для увеличения значения.

Так actualy:

  1. Вы должны сделать правильный ВЫБИРАЕМ о структуре данных.
  2. Устраните проблему с выбором данных.

Первый вопрос - компромисс между памятью и производительностью. Из вашего вопроса вам не нужно иметь какие-либо типы, если сортировка таких отсортированных множеств не является лучшим решением - потребляет много памяти, а ZINCRBY - это сложность времени O (log (N)) довольно HINCRBY и INCRBY is O (1). Поэтому мы должны выбрать betweeh хэши и строковые ключи. Посмотрите на question and answer о правильной оптимизации памяти в redis - согласно этому, я думаю, вы должны использовать хеши в качестве типа данных для своего решения.

Второй вопрос распространен для любых типов структур данных, поскольку все их типы не содержат функций select by name или их аналогов. Для решения этой проблемы мы можем использовать HMGET или LUA scripting. В любом случае это решение будет иметь временную сложность O (n).

Вот пример с Jedis (I`m не программиста Java, извините за возможные ошибки):

int fromMinute = 1; 
int toMinute = 10; 

List<String> list = new ArrayList<String>(); 
for(int i = fromMinute ; i < toMinute ; i++) { 
    list.add(i.toString()); 
} 

Jedis jedis = new Jedis("localhost"); 
List<String> values = jedis.hmget("your_set_name", list); 

Это решение является атомарным, быстро, имеет Трудоемкость О (п) и потребляют память как можно меньше в redis.

+0

Спасибо за информацию !! Я в значительной степени пришел к такому же выводу, однако я не думал о том, что hmget получит список ключей. Я смотрел на hscan и был очень ненавистен, чтобы это сделать. Я думаю, что это отличное решение! Я также нашел проект для узла, который имеет очень похожее решение, которое я собираюсь подражать. Он использует hashmaps для создания таймсерий, зависящих от детализации Minute/Hour/Second и т. Д. –

+1

Забыл отдать должное библиотеке узлов http://blog.apiaxle.com/post/storing-near-realtime-stats-in- Redis / –