web-dev-qa-db-ja.com

StackExchange.Redisを使用してユーザー定義オブジェクトを格納する方法

ServiceStack.redisでこれを行うことができました。

IRedisTypedClient<ObjectName> myObj = redisClient.As<ObjectName>();

しかし、StackExchange.Redisでこれを行う例は見つかりませんでした。

JSONにシリアル化して保存する必要がありますか?

よろしくお願いします。

23

現時点では、SE.Redisはシリアル化の提供を試みていません。これを行うには、あまりにも多くの異なる方法があります。私はライブラリが7ではなく1つのことを行うべきだという意見ではありません。ハイブリッドシリアライゼーションなどの懸念事項を、拡張メソッドやその他の配管/ラッピングコード、追加するシリアライゼーション戦略、およびライブラリを選択するだけで追加できるはずです。選んで。

23
Marc Gravell

最も簡単な解決策は、json/binary/otherシリアライゼーションを使用することです。より複雑ですがよりネイティブです-redis "ハッシュ"データ型を使用します

最初のケースでは、protobufライブラリを優先します(デフォルトで に含まれています)StackExchange.Redis.Extensions.Protobuf nugetパッケージ)。ただし、必要に応じてjson/binary/xmlシリアル化を使用できます。

それらすべてに関する優れたパフォーマンスレポートがあります: -servicestack-text /

9
Nigrimmist

例:以下のヘルパー関数のサンプルを作成し、JSON SerializeObject/DeSerializeObjectをget/setの前に使用します。ただし、このソリューションには、オブジェクトサイズがInt32.MaxNumberを超えてはならないという制限があります(2,147,483,647は2Gbです)。

サンプルコード

    public static void SetData<T>(string key, T data)
    {
        using (var redis = ConnectionMultiplexer.Connect("localhost:6379"))
        {
            IDatabase db = redis.GetDatabase();
            JavaScriptSerializer json_serializer = new JavaScriptSerializer();
            json_serializer.MaxJsonLength = int.MaxValue;

            db.StringSet(key, json_serializer.Serialize(data));
            redis.Close();
        }
    }

    public static T GetData<T>(string key)
    {
        using (var redis = ConnectionMultiplexer.Connect("localhost:6379"))
        {
            try
            {
                IDatabase db = redis.GetDatabase();
                var res = db.StringGet(key);

                redis.Close();
                if (res.IsNull)
                    return default(T);
                else
                    return JsonConvert.DeserializeObject<T>(res);
            }
            catch
            {
                return default(T);
            }

        }
    }