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つ取って、実際にその状態を維持していないことを確認します。
私の質問:
私はセット間の実際のプリミティブ型を維持して取得することができます任意の方法はありますか?私はいくつかのboxing \ unboxing問題を持っていることを理解しています オブジェクトとしてそれらを維持するが、私はこの特定のアプリケーションで多くの利点があります。 RedisValue構造体の使用は、アプリケーション全体でやりたいことではありません。私はRedisと通信する小さな特定の層にそれを保持したいと思います。
RedisValueがセットと取得の間にIsIntegerプロパティを保持しない理由は何ですか? RedisValueを設定すると、IsIntegerプロパティがtrueに設定され、フェッチするとfalseになります。
ありがとうございます。
Redisのデータはどのようにクエリしていますか?それをまったく打破する必要はありませんか?そうでない場合は、各プロパティの完全な型情報を持つ文字列としてJObjectを格納するだけで、正しい逆シリアル化が可能になります。 –
私はデータ構造が設計上の "平坦化されたオブジェクト"なので、完全なjsonを値として保持したくありません。 Redisは手袋のように私の「重要なデータ」アプローチに適しています。オブジェクトの背後には実際の構造がないので、元のタイプを維持したいと考えています。もし私が(RedisValueとして)intで更新する年齢の項目を持っていれば、私はそのデータを文字列ではなくintとしてフェッチしたいと思います。 –