Вы правы, что в 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, он не является немедленным. Вам нужно тщательно продумать модель как с точки зрения структуры, так и с точки зрения доступа к данным (т.е. во время разработки придерживайтесь ваших данных И ваших вариантов использования).