Gayan Jayasingha
Gayan Jayasingha

Reputation: 812

How to store user defined objects using StackExchange.Redis?

I was able to do this in ServiceStack.redis by using,

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

But I couldn't find any examples to do this in StackExchange.Redis.

Do I have to Serialize to JSON and then store them?

Thanx in advance.

Upvotes: 29

Views: 35460

Answers (3)

Nigrimmist
Nigrimmist

Reputation: 12406

Simplest solution will be use json/binary/other serialization. More complex but more native - using redis "hashes" data type.

In first case i prefer protobuf library (it included by default to StackExchange.Redis.Extensions.Protobuf nuget package). But you can use json/binary/xml serialization if you need.

There is a good performance report about them all : https://medium.com/@maximn/serialization-performance-comparison-xml-binary-json-p-ad737545d227

Upvotes: 12

Example: Create helper function sample below, used JSON SerializeObject/DeSerializeObject before get/set.But this solution has the limitation object size can't not over Int32.MaxNumber ( 2,147,483,647 is 2Gb ).

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

        }
    }

Upvotes: 6

Marc Gravell
Marc Gravell

Reputation: 1063964

At the current time, SE.Redis does not attempt to offer serialisation - there are simply too many different ways of doing that. I'm rather of the opinion that the library should do one thing, not 7. It should be possible to add any hybrid serialisation etc concerns simply by extension methods or other plumbing/wrapping code, choosing any serialisation strategy you choose, and any library you choose.

Upvotes: 30

Related Questions