2016-03-23 11 views
0

StackExchange.Redisクライアントを使用してキー値のペアを格納し始めました。StackExchange.Redisを使用しているときにRedisValueの上にC#プリミティブ型を保持する方法

私はネストされた動的オブジェクト(JObject)を持っていると私のようなものに見えるのキーと値の構造にそのオブジェクトをフラット化:私はこれを平ら

"Root": 
{ 
    "Obj1": 
    { 
     "Prop":12, 
     "Prop2": "StringValue" 
    } 
} 

は次のようにJObjectに見えると仮定しましょう

key: "Root.Obj1.Prop" | value: 12 
key: "Root.Obj1.Prop2" | value: "StringValue" 

私はを使用しています:のように見えるのキーと値のペアを生成Dictionary<string, object>にオブジェクトクライアントはさまざまなプリミティブ(常にstringsではない)の処理方法を知っているので、ではなくstringです。

特定のレディスクライアントは、複数のタイプに対して暗黙のキャスティングを持ちますがオブジェクトではない暗黙のキャスティングを持つ構造体を除いて、RedisValue構造体です。

だから私はRedisValuesを作成すると、元のタイプを「維持」するために、異なるプリミティブenumerablesに私の辞書を分割する必要がありました:

var strs = dic.Where(kvp => kvp.Value is string).Select(kvp => new HashEntry(kvp.Key, (string)kvp.Value)); 
var ints = dic.Where(kvp => kvp.Value is int).Select(kvp => new HashEntry(kvp.Key, (int)kvp.Value)); 

は今ints列挙内の各値がtrueに等しいIsInteger性を有しています。

これらの値でredisを設定した後、私は今Redisからキー値を取得しています。私は自分の手にRedisValuesの束を持っています。私は、IsIntegerプロパティがtrueに等しいRedisValueを1つ取って、実際にその状態を維持していないことを確認します。

私の質問:

  1. 私はセット間の実際のプリミティブ型を維持して取得することができます任意の方法はありますか?私はいくつかのboxing \ unboxing問題を持っていることを理解しています オブジェクトとしてそれらを維持するが、私はこの特定のアプリケーションで多くの利点があります。 RedisValue構造体の使用は、アプリケーション全体でやりたいことではありません。私はRedisと通信する小さな特定の層にそれを保持したいと思います。

  2. RedisValueがセットと取得の間にIsIntegerプロパティを保持しない理由は何ですか? RedisValueを設定すると、IsIntegerプロパティがtrueに設定され、フェッチするとfalseになります。

ありがとうございます。

+0

Redisのデータはどのようにクエリしていますか?それをまったく打破する必要はありませんか?そうでない場合は、各プロパティの完全な型情報を持つ文字列としてJObjectを格納するだけで、正しい逆シリアル化が可能になります。 –

+0

私はデータ構造が設計上の "平坦化されたオブジェクト"なので、完全なjsonを値として保持したくありません。 Redisは手袋のように私の「重要なデータ」アプローチに適しています。オブジェクトの背後には実際の構造がないので、元のタイプを維持したいと考えています。もし私が(RedisValueとして)intで更新する年齢の項目を持っていれば、私はそのデータを文字列ではなくintとしてフェッチしたいと思います。 –

答えて

3

タイプ情報を持つプロパティごとに追加のキーを書くことができます。

Root:Obj1:Prop=12 
Root:Obj1:Prop:type=int 

Root.Obj1.Prop2=StringValue 
Root.Obj1.Prop2:type=string 

常に値キーを変換する方法を知っているので、常に型キーを取得してください。

しかし、私はそれをお勧めしません。代わりに、Redisを使用してデータをクエリする方法に応じて、2つの標準的なアプローチのいずれかをお勧めします。

  1. 地図を強く

    • はRedisの操作を介した効率的な照会を優先
    • はあなたがマッピングクラスで
  2. をあなたのRedis特定のコードをローカライズすることができますされていることを前提とRedisのキーにオブジェクトを入力しました
  3. 持続オブジェクトを格納する

    • 基本的にデータのBLOB。完全なJSONオブジェクトである可能性があります(各プロパティの完全な型情報を含んでいても、Json.Netで有効にするオプションがあります)。またはprotobufを使用してバイトの配列を返します。
    • Redisをストレージ専用に使用していると仮定します。 OKです
+1

返事をありがとう。私はタイプ情報のための追加のプロパティを書くことができ、私はそこに行きたくありません。 私のjsonオブジェクトは完全な動的なので、強い型をマップすることはできません(第三者サービスは私にデータの小さな部分を与え、私はこのjsonをその場で構築します)。 データ構造を効率的かつ読みやすくするために、今のようにデータ構造を維持したいと考えています。 ありがとうございました。 +1の努力。 –

+1

np、フィードバックありがとうございます。あなたの状況を考えれば、私はBLOBアプローチがあなたのために一番うまくいくと思っています。あなたは本当にオブジェクトを分解する必要があると言いますが、レディスの種類の例がなければ助けはできません。私の反応は聞きたいことではないかもしれませんが、質問に答えると思うなら、それを受け入れたものとしてマークしてください。ありがとう –

関連する問題