Нужна помощь в концептуализации в Redis / NoSQL - PullRequest
7 голосов
/ 24 февраля 2012

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

Итак, я получаю имя устройства и порт.Мне нужно связать это с одним клиентом, а затем связать этого клиента с методом доставки.С реляционной базой данных это выглядело бы, вероятно, примерно так:

Device name: Los_Angeles
Port: 11

SELECT Customer_ID, Customer_name from device_info where device_port = 'Los_Angeles:11'
SELECT Customer_protocol, SNMP_destination, Syslog_destination from CUSTOMER 
    where Customer_ID = <customer_id from above>

(очень упрощенный пример).

Я вижу, как это сделать программно с помощью хеша списков или хешахешей.Но я думаю, что в Redis у меня проблемы с тем, что эти более сложные структуры данных мне недоступны (насколько я знаю).Итак, как мне связать несколько частей информации с одним ключом?Я могу придумать несколько способов, которыми я могу это сделать, но все они, по-видимому, состоят из нескольких этапов, и я хотел бы получить некоторую информацию от нынешних программистов Redis о том, какой «лучший» способ сделать это.

1 Ответ

12 голосов
/ 25 февраля 2012

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

Например, элементы, содержащиеся в наборе, могут быть ключами для других объектов (списки, хэш-таблицы, другие наборы и т. Д.). Давайте попробуем применить это к вашему примеру.

Чтобы смоделировать отношения между клиентами и портом устройства +, вы можете использовать наборы, содержащие идентификаторы клиентов. Для хранения информации о клиентах подойдет одна хеш-таблица для каждого клиента.

Вот клиенты:

hmset c:1 name Smith protocol tcp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:2 name Jackson protocol udp snmp_dest 127.0.0.1 syslog_dest 127.0.0.2
hmset c:3 name Davis protocol tcp snmp_dest 127.0.0.3 syslog_dest 127.0.0.4

Ключи этих записей: c: ID

Давайте свяжем два из них с устройством и портом:

sadd d:Los_Angeles:11 2 3

Ключ этого набора - d: устройство: порт. Префиксы c: и d: это просто соглашение. Один набор на устройство / порт должен быть создан. Данный клиент может принадлежать к нескольким наборам (и, следовательно, связан с несколькими устройствами / портами).

Теперь, чтобы найти клиентов с методами доставки, подключенными к этому устройству / порту, нам просто нужно получить содержимое набора.

smembers d:Los_Angeles:11
1) "2"
2) "3"

тогда соответствующая информация о клиенте может быть получена путем конвейерной передачи ряда команд hgetall:

hgetall c:2
hgetall c:3
1) "name"
2) "Jackson"
3) "protocol"
4) "udp"
5) "snmp_dest"
6) "127.0.0.1"
7) "syslog_dest"
8) "127.0.0.2"
1) "name"
2) "Davis"
3) "protocol"
4) "tcp"
5) "snmp_dest"
6) "127.0.0.3"
7) "syslog_dest"
8) "127.0.0.4"

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

Теперь можно еще немного оптимизировать, благодаря вездесущей команде SORT. Это, вероятно, самая сложная команда в Redis, и ее можно использовать для сохранения туда и обратно.

sort d:Los_Angeles:11 by nosort get c:*->name get c:*->protocol get c:*->snmp_dest get c:*->syslog_dest
1) "Jackson"
2) "udp"
3) "127.0.0.1"
4) "127.0.0.2"
5) "Davis"
6) "tcp"
7) "127.0.0.3"
8) "127.0.0.4"

В одной команде он извлекает содержимое набора устройств / портов и извлекает соответствующую информацию о клиенте.

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

...