2012-02-24 9 views
7

私はRedisを使用するためのすべてのコマンドをよく理解していると思いますが、使用する最良の方法を理解するのが難しいです。私は顧客の通知システムを設計しています。顧客の通知システムでは、アラームが発生したときに優先する方法(Email、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> 

(非常に単純化された例)。

リストのハッシュまたはハッシュのハッシュを使ってプログラムでこれを行う方法を見ることができます。しかし、私はレディスで問題を抱えていると思うのは、より複雑なデータ構造が(私が知る限り)利用できないということです。では、複数の情報を1つのキーにどのように関連付けるのですか?私はそれをやることができるいくつかの方法を考えることができますが、それらはすべて複数のステップを含むように思われます、そして、私は現在のRedisプログラマーから、これを行うための「最良の」方法について何らかのインプットをお願いしたいと思います。

+0

Redis Hashを見ましたか?たとえば、hmset/hmgetを使うと、あなたのアイデンティティを表すことができる単一のキーと複数の「フィールド」を関連付けることができます。 http://openmymind.net/2012/1/23/The-Little-Redis-Book/ - レディス・ブックには良い例がいくつかあります。 – Alex

+0

私は実際にはHMSET/HMGETを見ませんでした。私が経験したチュートリアルの後で、それは新しい追加でなければならない。私はそれで遊ぶだろう。 –

答えて

10

Redisでは単純なデータ構造しか利用できず、(CouchDBやMongoDBなどのドキュメント指向のデータベースのように)値で構成することはできません。しかし、参照によってデータ構造を構成することは可能であり、これは非常に一般的なパターンです。

たとえば、セットに含まれるアイテムは、他のオブジェクト(リスト、ハッシュテーブル、その他のセットなど)のキーにすることができます。あなたの例にこれを適用しようとしましょう。

顧客とデバイス+ポート間の関係をモデル化するには、顧客IDを含むセットを使用できます。顧客に関する情報を格納するには、顧客ごとに1つのハッシュテーブルが必要です。ここで

お客様は、以下のとおりです。これらのレコードの

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

はのは、デバイスとポートにそれらのうちの2つを関連付けてみましょう:

sadd d:Los_Angeles:11 2 3 

のキーこのセットはd:device:portです。 c:とd:の接頭辞は単なる慣例に過ぎません。 デバイス/ポートごとに1つのセットを作成する必要があります。所与の顧客は、いくつかのセットに属することができる(したがって、いくつかのデバイス/ポートに関連付けられる)。

このデバイス/ポートに接続された配信方法を使用している顧客を見つけるには、そのセットのコンテンツを取得するだけで済みます。その後、該当する顧客情報が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クライアントはクエリをパイプライン化して最小限のラウンドトリップしか必要としません。 1人の犯人といくつかのhgetallを使うだけで、問題はわずか2回の往復で解決できます。

ここで、ユビキタスなSORTコマンドのおかげで、さらに少し最適化することができます。これはおそらくレディスで最も複雑なコマンドであり、ここでラウンドトリップを保存するために使用できます。

コマンドでは、デバイス/ポートセットの内容を取得し、対応するカスタマー情報を取得します。

この例は簡単ですが、より一般的には、複雑なデータ構造をRedisで表現することはできますが、即時ではありません。構造とデータアクセスの両方でモデルを慎重に考える必要があります(つまり、設計時に、データにのユースケースを守ります)。

+0

ありがとう!それはまさに私が探していたものです。 –

関連する問題