2017-01-21 4 views
0
{ 
    "chats": { 
     "Main": { 
      "3": { 
       "u": "George", 
       "n": "G", 
       "f": "1", 
       "a": "http://example.com/a.png" 
      }, 
      "4": { 
       "u": "Lisa", 
       "n": "L", 
       "f": "1", 
       "a": "http://example.com/b.png" 
      } 
     } 
    } 
} 

私は通常、私はまた、ユーザーにこのデータを送信できるようにする必要がありますNode.jsのこのタイプのネストされたオブジェクトは、どのようにしてレディスに保存できますか?

でオブジェクトでこれを格納します。私がする必要があるだろうかの例は、サインインし、新しいユーザーにチャット内のすべてのユーザーに送信され

だから、単純に次のようになります。users = obj.chats.Main

しかし、私はどのように把握することはできませんデータを取得してそれをオブジェクトに戻してユーザーに送信する方法はもちろん、それを赤字で保存します。

このオブジェクトは、より多くのユーザーがログインするとかなり大きくなります。たとえば、一度に100,000人のユーザーがサインインしているとします。

私は一種のこの作品を作るためにセット内のセットを必要とするが、私はそれは単純なアプローチは、それぞれが各ユーザーのユーザーのRedisのセットを、チャット作ることであろうRedisの

答えて

1

では可能だとは思いませんデータを含むJSON文字列です。各チャットには"chat:Main"のようなキーが含まれている可能性があります。次に、すべてのチャットのキーを含む別のセット(たとえば、"chat:Main"などのメンバーを持つ"chats"というセットなど)を取得します。

ユーザーが多数のチャットに出席できる場合、またはユーザーの個々のフィールドを簡単に変更できるようにしたい場合(例:Lisaのfから2に変更)、代わりに各ユーザーをRedisハッシュとして表すことができます。その場合、上記のセットには、データそのもののJSON文字列ではなく、ユーザーのハッシュキーが含まれます。それはアーキテクチャを複雑にしますが、データやアクセスパターンによっては、メモリの使用量が減少したり、効率が向上する可能性があります。

このデザインでチャットルームの情報を取得するには、"chat:Main"のメンバーを取得してから、ループしてループし、それぞれにHGETALLを付けます。パイプライニングを使用すると、2回のRedisラウンドトリップ(1つはチャットグループのメンバーを取得し、もう1つはHGETALLsすべてを実行する)で行うことができます。あるいは、Luaスクリプトを書いて、Redisサーバーへの一回の旅行ですべてを行うこともできます。

+0

提案していただきありがとうございます。私は個々のフィールドを簡単に変更できる必要があります。しかし、同時に、チャットにサインインしたすべてのユーザーのデータを取得し、サインイン時に新しいユーザーに配信する必要があります(データをオブジェクトにコンパイルする必要があります)。あなたが提案した方法はこれで動作するでしょうか? –

+0

@JDel:私はそれを行う方法を説明する答えを編集しました。しかし、現在のJavascriptオブジェクトで個々のフィールドをどのように編集しますか?すべてのチャットルームをループして、Lisaを探して毎回フィールドを変更しますか?あなたがそれに満足すれば、私は最初の段落で述べたよりシンプルなデザインで同じことをすることができます。 –

+0

オブジェクトを使ってフィールドを編集することは、すべての設定方法のために実際はかなり簡単です。私の状況では、ユーザーがニックネームを変更することを決定した場合、その機能にはユーザーIDと既にサインインしているチャットがあります。 obj.chats [chatName] [userid] .n = "新しいニックネーム"; ' –

関連する問題