我们的生产Web服务器有一台运行Windows Server 2003的服务器。我们的网站有不同的模块,每个模块都在自己的应用程序池中运行。这使缓存成为一个问题,因为每个模块都有自己的缓存,并且通常多个模块缓存相同的项目。问题是当缓存中的项目在一个模块中被更改时,缓存同一项目的另一个模块不能轻易刷新。
我们的网站是用ASP.NET 4.0编写的,我们使用标准的HttpRuntime.Cache对象作为简单的键/值存储来缓存数据集,业务对象,集合,列表等。我们不使用任何文件依赖项,但我们确实使用了时间到期。我们一次只有大约400个用户,所以我们没有做太疯狂的事情。
听起来某种共享/分布式缓存可以帮助解决这个问题,但我不确定使用哪一个或者是否更好地推广我们自己,因为我们不需要大多数可用的功能我见过的产品我见过一些使用WCF的例子,但大多数人建议不要在生产中使用他们的例子,我对WCF知之甚少。
我正在寻找一种简单,快速,轻便,安全的生产方式,并且如果可能的话,最好是免费的但不一定是免费的。它需要在Windows Server 2003和Windows上运行。使用ASP.NET 4.0。
有任何建议或信息吗?
答案 0 :(得分:12)
简单,快速,轻便,安全的声音,如redis和memcached,可以作为中央缓存非常有效。对于stackoverflow,我们通过BookSleeve(客户端)使用redis,但大多数商店的工作方式类似。还有一个AppFabric缓存,但这要复杂得多。
关键点:
答案 1 :(得分:7)
memcached以及ASP.NET provider是一个受欢迎的选择。请记住,在.NET 4.0中,推荐的缓存方法是使用新的ObjectCache而不是HttpRuntime.Cache
。 .NET框架中有内置的内存实现(MemoryCache),您也可以签出implementation for memcached。
答案 2 :(得分:3)
试试Dache。它是一个开源的.NET分布式缓存解决方案,性能极高。 http://www.getdache.net
答案 3 :(得分:1)
我使用Redis实现了一个简单的分布式缓存:
public class RedisCacher
{
private static Lazy<ConnectionMultiplexer> _lazyConnection;
public static ConnectionMultiplexer Connection
{
get
{
return _lazyConnection.Value;
}
}
public RedisCacher()
{
string redisConnectionString = $"your redis connection(IP, Port ...)";
_lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect(redisConnectionString);
});
}
public void Delete(string key)
{
var redis = Connection.GetDatabase();
redis.KeyDelete(key);
}
public T GetValue<T>(string key)
{
var redis = Connection.GetDatabase();
string valueAsStringFromRedis = redis.StringGet(key);
var value = JsonConvert.DeserializeObject<T>(valueAsStringFromRedis);
return value;
}
public void Add<T>(string key, T value, TimeSpan expirationTime)
{
var redis = Connection.GetDatabase();
string valueAsString = JsonConvert.SerializeObject(value);
redis.StringSet(key, valueAsString, expiry: expirationTime);
}
}
用法是:
var cacher = new RedisCacher();
cacher.Add(id.ToString(), request.Request.ProductTree, DateTimeOffset.UtcNow.AddMinutes(30).TimeOfDay);
.....
var cacher = new RedisCacher();
var productTree = cacher.GetValue<ProductTreeItem>(id);
答案 4 :(得分:0)
如果价格不是问题,那么NCache可能是您最好的选择。它的最新版本(NCache 4.1)适用于.NET 4.0