Azure Redis 缓存获取和设置复杂类型
Azure Redis Cache Get and Set Complex Types
我正在创建一个 POC,看看我们是否可以在下一个项目中使用 azure redis 缓存。我查看了这个 MSDN 文档 http://azure.microsoft.com/en-us/documentation/articles/cache-dotnet-how-to-use-azure-redis-cache/#connect-to-cache.
并有以下 questions/doubts:
- 连接到 redis 的唯一方式(优雅)是通过下面的代码?难道不能像配置 Redis 缓存一样工作吗?
ConnectionMultiplexer connection =
ConnectionMultiplexer.Connect("contoso5.redis.cache.windows.net,ssl=true,password=...");
我们需要在上面调用并为每个Get和Set连接到redis吗?如果不是,我们如何只调用一次并重新使用?
我能看到的只有StringGet和StringSet。是否也可以设置复杂的 .NET 类型?例子会很好。以下是我过去使用专用 azure 缓存或 ent.Lib 缓存所做的。
public class CacheManager
{
public void AddToCache(string Id, T value)
{
string Key = this.MakeKey(Id);
if (this.m_Cache.Contains(Key))
{
this.m_Cache.Remove(Key);
}
------
this.m_Cache.Add(Key, value,CacheItemPriority.Normal, null, expireTime);
} }
您可以拥有一个 ConnectionMultiplexer 实例并将其用于整个应用程序。您无需为每个 Get/Set 调用创建一个。
你可以找到一个例子 http://azure.microsoft.com/blog/2014/06/05/mvc-movie-app-with-azure-redis-cache-in-15-minutes/。我正在复制下面的相关代码
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
var config = new ConfigurationOptions();
config.EndPoints.Add(cachename);
config.Password = password;
config.Ssl = true;
config.SyncTimeout = 150;
return ConnectionMultiplexer.Connect(config);
});
您也可以在缓存中存储对象。我上面提到的相同 link 显示了如何将 .NET 对象序列化到缓存中。
是的,您想重用 Connect
创建的 ConnectionMultiplexer
实例。所以静态变量方法应该很好。
关于保存 Poco 对象,是的,这当然是可能的,但对于除某些基本类型之外的任何其他对象,您都必须序列化和反序列化对象。这可能非常慢。
特别是如果您使用二进制格式化程序,如 pranav rastogi 的答案示例所示。
我要么将对象的值存储在缓存中,以便您只在缓存中存储非复杂类型,如字符串、字节数组、整数等...要么使用更快的序列化方法。即使 Json 序列化通常也快得多。
如果你不想自己实现所有这些,只想要一个强类型的缓存系统,你也可以使用我的 CacheManager,它也支持 Redis,基于 StackExchange.Redis 客户...
尽管我不得不承认,如果您要存储的是未知类型,我也会使用 BinaryFormatter 进行序列化。但这可能会改变,我可能也会支持 Protobuf 和 Json...
我正在创建一个 POC,看看我们是否可以在下一个项目中使用 azure redis 缓存。我查看了这个 MSDN 文档 http://azure.microsoft.com/en-us/documentation/articles/cache-dotnet-how-to-use-azure-redis-cache/#connect-to-cache.
并有以下 questions/doubts:
- 连接到 redis 的唯一方式(优雅)是通过下面的代码?难道不能像配置 Redis 缓存一样工作吗?
ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("contoso5.redis.cache.windows.net,ssl=true,password=...");
我们需要在上面调用并为每个Get和Set连接到redis吗?如果不是,我们如何只调用一次并重新使用?
我能看到的只有StringGet和StringSet。是否也可以设置复杂的 .NET 类型?例子会很好。以下是我过去使用专用 azure 缓存或 ent.Lib 缓存所做的。
public class CacheManager {
public void AddToCache(string Id, T value) { string Key = this.MakeKey(Id); if (this.m_Cache.Contains(Key)) { this.m_Cache.Remove(Key); } ------ this.m_Cache.Add(Key, value,CacheItemPriority.Normal, null, expireTime); } }
您可以拥有一个 ConnectionMultiplexer 实例并将其用于整个应用程序。您无需为每个 Get/Set 调用创建一个。 你可以找到一个例子 http://azure.microsoft.com/blog/2014/06/05/mvc-movie-app-with-azure-redis-cache-in-15-minutes/。我正在复制下面的相关代码
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
var config = new ConfigurationOptions();
config.EndPoints.Add(cachename);
config.Password = password;
config.Ssl = true;
config.SyncTimeout = 150;
return ConnectionMultiplexer.Connect(config);
});
您也可以在缓存中存储对象。我上面提到的相同 link 显示了如何将 .NET 对象序列化到缓存中。
是的,您想重用 Connect
创建的 ConnectionMultiplexer
实例。所以静态变量方法应该很好。
关于保存 Poco 对象,是的,这当然是可能的,但对于除某些基本类型之外的任何其他对象,您都必须序列化和反序列化对象。这可能非常慢。 特别是如果您使用二进制格式化程序,如 pranav rastogi 的答案示例所示。
我要么将对象的值存储在缓存中,以便您只在缓存中存储非复杂类型,如字符串、字节数组、整数等...要么使用更快的序列化方法。即使 Json 序列化通常也快得多。
如果你不想自己实现所有这些,只想要一个强类型的缓存系统,你也可以使用我的 CacheManager,它也支持 Redis,基于 StackExchange.Redis 客户...
尽管我不得不承认,如果您要存储的是未知类型,我也会使用 BinaryFormatter 进行序列化。但这可能会改变,我可能也会支持 Protobuf 和 Json...