【发布时间】:2014-10-21 13:53:19
【问题描述】:
我可以在 ServiceStack.redis 中使用,
IRedisTypedClient<ObjectName> myObj = redisClient.As<ObjectName>();
但我在 StackExchange.Redis 中找不到任何示例。
我是否必须序列化为 JSON 然后存储它们?
提前感谢。
【问题讨论】:
标签: c# .net redis stackexchange.redis
我可以在 ServiceStack.redis 中使用,
IRedisTypedClient<ObjectName> myObj = redisClient.As<ObjectName>();
但我在 StackExchange.Redis 中找不到任何示例。
我是否必须序列化为 JSON 然后存储它们?
提前感谢。
【问题讨论】:
标签: c# .net redis stackexchange.redis
目前,SE.Redis 不尝试提供序列化 - 有太多不同的方法可以做到这一点。我更倾向于认为库应该做一件事,而不是 7。应该可以通过扩展方法或其他管道/包装代码添加任何混合序列化等关注点,选择您选择的任何序列化策略以及任何库你选择。
【讨论】:
最简单的解决方案是使用 json/binary/other 序列化。更复杂但更原生 - 使用 redis "hashes" data type。
在第一种情况下,我更喜欢 protobuf 库(它默认包含在 StackExchange.Redis.Extensions.Protobuf nuget 包中)。但如果需要,您可以使用 json/binary/xml 序列化。
【讨论】:
示例:在下面创建辅助函数示例,在 get/set 之前使用 JSON SerializeObject/DeSerializeObject。但此解决方案有限制对象大小不能超过 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);
}
}
}
【讨论】:
ConnectionMultiplexer.Connect。您应该存储连接并每次使用轻量级GetDatabase()。