web-dev-qa-db-fra.com

Comment stocker des objets définis par l'utilisateur à l'aide de StackExchange.Redis?

J'ai pu le faire dans ServiceStack.redis en utilisant,

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

Mais je n'ai trouvé aucun exemple pour ce faire dans StackExchange.Redis.

Dois-je sérialiser en JSON puis les stocker?

Merci d'avance.

20
Gayan Jayasingha

À l’heure actuelle, SE.Redis n’essaie pas d’offrir la sérialisation - il existe tout simplement trop de façons différentes de le faire. Je suis plutôt d'avis que la bibliothèque doit faire une chose, pas 7. Il devrait être possible d'ajouter toute préoccupation de sérialisation hybride, etc. simplement par des méthodes d'extension ou un autre code de plomberie/habillage, en choisissant la stratégie de sérialisation que vous choisissez et toute bibliothèque. tu choisis.

21
Marc Gravell

La solution la plus simple consiste à utiliser la sérialisation json/binary/other. Plus complexe mais plus natif - en utilisant redis le type de données "hashes" .

Dans le premier cas, je préfère la bibliothèque protobuf (incluse par défaut dans StackExchange.Redis.Extensions.Protobuf paquet nuget). Mais vous pouvez utiliser la sérialisation json/binary/xml si vous en avez besoin. 

Il existe un bon rapport de performances à leur sujet: http://www.maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/

8
Nigrimmist

Exemple: Créer un exemple de fonction d'assistance ci-dessous, utilisé JSON SerializeObject/DeSerializeObject avant get/set.Mais cette solution a la taille de l'objet de limitation ne peut pas dépasser Int32.MaxNumber (2 147 483 647 est 2 Go).

Exemple de code 

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

        }
    }
0