2016-05-22 5 views
2

私のクライアントはサーバーにjson(JObject)を送信し、その値をキー値のペアにフラット化するカスタムメソッドがあります。Redisハッシュよりも強力なタイプはどのように処理できますか?

平坦化されたデータのA辞書は、次のようになりますが作成され

{ 
    Prop1: 12, 
    Prop2: "Str", 
    Prop3:{ 
     Prop4: 222.4 
    } 
} 

これは私のJSONであると仮定すると:今

"Prop1": 12 
"Prop2": "Str" 
"Prop3.Prop4": 222.4 

、私はRedisのStackExchange.Redisを使用していますクライアント)。

キー(例:obj:123456)を生成し、辞書のキー値をハッシュエントリとして追加します。

データはのRedisに保存されますが、私の問題は、私は私がRedisのからデータを取得する際の型を区別する必要があるということです。

私はIsIntegerフラグに気付き、それを最初から使用したいと思っていました。 整数値(IsIntegerがtrue)のHashEntryを作成してから、HashSettedのデータを作成しました。 HashGetを使用してデータを取得したとき、私はIsIntegerフラグがfalseであることに気付きました。

IsIntegerフラグがHashSetHashGetの間に失われる理由はありますか?

タイプ(文字列\ int \ double \ date)を処理するための些細な方法はありませんRedis?私はカスタム実装を考えることができますが、私はそこに行きたいと思います。

編集 - ここでのコードの例です:

Dictionary<string, object> objs = new Dictionary<string, object> 
{ 
    {"Prop1", 12}, 
    {"Prop2", "Str"}, 
    {"Prop3.Prop4", 222.4}, 
}; 

var redisConnection = ConnectionMultiplexer.Connect(ConfigurationOptions.Parse("localhost:6379,name=SafeRedisConnection,connectTimeout=100000,syncTimeout=100000,abortConnect=false,defaultDatabase=5")); 

// just a test 
var hashEntries = objs.Where(kvp => kvp.Value is int).Select(kvp => new HashEntry(kvp.Key, (int)kvp.Value)); 
var hashEntries1 = objs.Where(kvp => kvp.Value is string).Select(kvp => new HashEntry(kvp.Key, (string)kvp.Value)); 
var hashEntries2 = objs.Where(kvp => kvp.Value is double).Select(kvp => new HashEntry(kvp.Key, (double)kvp.Value)); 

var arr = hashEntries.Union(hashEntries1).Union(hashEntries2).ToArray(); 
redisConnection.GetDatabase().HashSet("obj:123456", arr); 

var keys = redisConnection.GetDatabase().HashKeys("obj:123456"); 
var dic = keys.ToDictionary(k => k, k => redisConnection.GetDatabase().HashGet("obj:123456", k)); 
+0

データの設定方法やデータを取得するコードを追加できますか? –

+0

@YuvalItzchakov - いくつかのコードを追加しました。タイプ別の分離は、私がIsIntegerのことをテストしたものです。私は、ここでレディスよりも "タイプ"を得るより良い習慣について嬉しく思います。 –

答えて

1

あなたがあなた自身のRedisのキーの命名規則で遊ぶ必要があります。レディスでは、すべての単純な値がの文字列であることを覚えておいてください(ただし、バイト配列... StackExchange.RedisにはRedisValuestringに変換する暗黙の演算子があります)。あなたには、いくつかのRedisのハッシュ上ペアを追加するとき

例えば、キーは<propertyName>:<type>、あなたは再びCLR型へのキーの値を変換する上で動作することができ、このよう...

別のアプローチは、両方の可能性があることができそれぞれがキーのデータ型を格納するために別のハッシュと一緒にハッシュ保存:あなたには、いくつかまたは全てのハッシュエントリを取得するたびに

var hashEntries = objs.Where(kvp => kvp.Value is int) 
         .Select 
         (
          kvp => new HashEntry 
          (
           kvp.Key, 
           kvp.Value.GetType().AssemblyQualifiedName 
         ) 
        ); 

、あなたはまた、それぞれの値の種類を確認するためにそのメタデータだけの対応を得ることができます。

ところで、JSON直列化オブジェクトをグローバル/パーティション化されたハッシュに挿入するか、グローバルキースペースの一部として単純なキーストリングキーを使用することを検討してください。

いくつかのプロパティやその他のケースでデータのインデックスを作成するなどの操作を実行する必要がある場合は、個々のプロパティを格納するためにハッシュを使用しますが、完全なオブジェクトを格納するだけの場合は、

+0

答えをありがとう。私はいくつかのカスタム実装について考えました(最初のバイトを "型"としてバイト配列の実装を提案したようなもの) - しかし、それは実装のパフォーマンスを殺してしまいます。私は理由のために平坦化技術を使用しています、そして、私はもっと頑強な何かを望んでいました。 +1の努力。 –

+0

@AmirPopovichしかし、最初のバイトのことは過剰です、あなたはキー命名スキームを使用することができます! :D –

関連する問題