Redis
 sql >> база данни >  >> NoSQL >> Redis

Нуждаете се от помощ за концептуализиране в Redis/NoSQL

Прав сте, че само прости структури от данни са налични с 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:device:port. Префиксите 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 имат способността да насочват заявките, така че да са необходими само минимален брой двупосочни пътувания. Като използвате само един smembers и няколко hgetall, проблемът може да бъде решен само с две двупосочни пътувания.

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Сканирането на redis връща празни резултати, но ненулев курсор

  2. Node.js &Redis; Изчаква се цикълът да завърши

  3. RQ - Изпразване и изтриване на опашки

  4. Запазване на потребителска сесия в Redis с ASP.NET Core в Azure

  5. Възможен ли е redis на Heroku без добавка?