Хранение временной шкалы событий в Redis - PullRequest
1 голос
/ 30 декабря 2011

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

Проблема в том, что я хочу, чтобы каждое из этих событий представляло объект с парой ключей (может быть, около 3), поэтому я бы сохранял отсортированный набор идентификаторов - приложение затем будет искать хеш на основе идентификатора. ,

Итак, разговор будет выглядеть примерно так:

> ZRANGEBYSCORE events start end 
1) "16"
2) "17"
> HGETALL events:16
1) "key1"
2) "val1"
...
> HGETALL events:17
...

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

PS. Я использую нод-клиент, но мой вопрос относится и к другим языкам.

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Очевидное решение - работать по значению, а не по ссылке. Таким образом, ваш zset может хранить сериализованные объекты вместо хранения ссылок на эти объекты. С узлом JSON прост в использовании.

Теперь, если вам нужно сохранить текущую структуру (потому что, например, некоторые из ваших объектов совместно используются различными zsets), тогда вам нужно думать не о командах, а о командах. В Redis дорого обходится прием туда и обратно, а не выполнение самой команды O (1).

HGETALL не поддерживает переменные параметры (т. Е. Вы можете получить только один хеш-объект). Но Redis довольно хорош в обработке конвейерных команд, и это особенно легко сделать с помощью драйвера node_redis из-за асинхронного характера узла. Таким образом, в вашем примере вам просто нужно 2 циклических обхода: первый для выполнения ZRANGEBYSCORE и второй для выполнения всех команд HGETALL (то есть не ждите результата первой команды HGETALL перед выпуском второй). Это будет довольно эффективно.

В текущей версии Redis (2.4) нет возможности устранить вторую поездку туда и обратно.

1 голос
/ 30 декабря 2011

Вы можете преобразовать объект в строку и сохранить его как строку с JSON.stringify(), а затем получить его с помощью JSON.parse()

...