it-swarm.com.de

Wie speichere ich benutzerdefinierte Objekte mit StackExchange.Redis?

Ich konnte dies in ServiceStack.redis tun, indem ich

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

Aber ich konnte keine Beispiele finden, um dies in StackExchange.Redis zu tun.

Muss ich zu JSON serialisieren und diese dann speichern?

Vielen Dank im Voraus.

20

SE.Redis versucht derzeit nicht, die Serialisierung anzubieten - dafür gibt es einfach zu viele Möglichkeiten. Ich bin eher der Meinung, dass die Bibliothek eine Sache tun sollte, nicht 7. Es sollte möglich sein, Hybridserialisierungen usw. einfach durch Erweiterungsmethoden oder anderen Installationscode hinzuzufügen, eine beliebige Serialisierungsstrategie auszuwählen und jede Bibliothek auszuwählen du wählst.

21
Marc Gravell

Die einfachste Lösung ist die Verwendung von Json/Binär/anderer Serialisierung. Komplexer aber nativer - mit redis Datentyp "Hashes" .

Im ersten Fall bevorzuge ich protobuf library (standardmäßig in StackExchange.Redis.Extensions.Protobuf Nuget-Paket enthalten. Sie können jedoch die Json/binary/xml-Serialisierung verwenden, wenn Sie dies benötigen. 

Es gibt einen guten Leistungsbericht über alle: http://www.maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text /

8
Nigrimmist

Beispiel: Erstellen Sie ein Helper-Funktionsbeispiel, das vor dem Abrufen von get/set JSON SerializeObject/DeSerializeObject verwendet wird. Diese Lösung hat jedoch die Einschränkung, dass die Objektgröße nicht über Int32.MaxNumber (2.147.483.647 = 2 GB) liegen kann.

Beispielcode 

    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);
            }

        }
    }