2012-02-24 2 views
7

저는 Redis를 사용하는 데 필요한 모든 명령을 잘 알고 있다고 생각합니다. 그러나이를 사용하는 가장 좋은 방법을 찾는 데 어려움이 있습니다. 그들의 회로에 경보가있을 때 선호하는 방법 (전자 메일, SNMP, syslog)을 통해이를 알리는 고객 알림 시스템을 설계하고 있습니다.Redis/NoSQL에서 개념화하는 데 도움이 필요합니다

그래서 장치 이름과 포트를 얻습니다. 나는 그것을 단일 고객과 연관시켜야하고, 그 고객을 전달 방법에 연관시켜야합니다. 관계형 데이터베이스에서는 다음과 같이 보일 수 있습니다.

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 프로그래머의 의견을 듣고 싶습니다.

+0

Redis Hash를 살펴 보셨습니까? 예를 들어 hmset/hmget을 사용하면 ID를 나타낼 수있는 단일 키와 여러 '필드'를 연결할 수 있습니다. http://openmymind.net/2012/1/23/The-Little-Redis-Book/ - Redis Book에는 좋은 예가 있습니다. – Alex

+0

나는 실제로 HMSET/HMGET을 보지 못했다. 이 튜토리얼을 끝내면 새로 추가해야합니다. 나는 그걸 가지고 놀거야. –

답변

10

Redis에서는 간단한 데이터 구조 만 사용할 수 있으며 CouchDB 또는 MongoDB와 같은 문서 지향 데이터베이스와 마찬가지로 값으로 구성 할 수 없습니다. 그러나 참조로 데이터 구조를 구성하는 것이 가능하며 이는 매우 일반적인 패턴입니다.

예를 들어 집합에 포함 된 항목은 다른 개체 (목록, 해시 테이블, 다른 집합 등)의 키일 수 있습니다. 이것을 귀하의 예에 적용 해 보겠습니다.

고객과 device + port 간의 관계를 모델링하려면 고객 ID가 포함 된 세트를 사용할 수 있습니다. 고객에 대한 정보를 저장하려면 고객 당 하나의 해시 테이블이 좋습니다. ID 장치와 포트로의

하자 연관이 :의

sadd d:Los_Angeles:11 2 3 

주요 여기

은 고객입니다 : C 이러한 기록의

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 

키입니다 이 세트는 d : device : port입니다. c : 및 d : 접두사는 단지 규칙입니다. 장치/포트별로 하나의 세트를 만들어야합니다. 주어진 고객은 여러 세트에 속할 수 있으므로 여러 장치/포트와 연관 ​​될 수 있습니다.

이제이 기기/포트에 연결된 배송 방법을 사용하는 고객을 찾으려면 세트의 콘텐츠를 검색하기 만하면됩니다. 그런 다음 해당 고객 정보가 hgetall 명령의 수를 파이프 라이닝하여 검색 할 수 있습니다

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

:

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 클라이언트는 최소 왕복 횟수 만 필요하도록 쿼리를 파이프 라인 처리 할 수 ​​있습니다. 한 명의 스먼트 멤버와 여러 명의 hgetall을 사용하면이 문제는 단지 두 번의 왕복으로 해결할 수 있습니다.

이제 유비 쿼터스 SORT 명령 덕분에 비트를 더 최적화 할 수 있습니다. 이것은 아마도 레디 스에서 가장 복잡한 명령 일 것입니다. 여기서는 왕복을 저장하는 데 사용할 수 있습니다.

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를 사용하여 복잡한 데이터 구조를 나타낼 수는 있지만 즉각적인 것은 아닙니다. 구조와 데이터 액세스 측면에서 모델을 신중하게 생각해야합니다 (예 : 디자인 타임에 데이터 사례를 활용하십시오).

+0

감사합니다. 그것은 내가 찾고 있었던 바로 그 것이다. –

관련 문제