对简单的.NET分布式缓存解决方案的建议

时间:2011-12-08 14:26:38

标签: asp.net .net caching memcached redis

我们的生产Web服务器有一台运行Windows Server 2003的服务器。我们的网站有不同的模块,每个模块都在自己的应用程序池中运行。这使缓存成为一个问题,因为每个模块都有自己的缓存,并且通常多个模块缓存相同的项目。问题是当缓存中的项目在一个模块中被更改时,缓存同一项目的另一个模块不能轻易刷新。

我们的网站是用ASP.NET 4.0编写的,我们使用标准的HttpRuntime.Cache对象作为简单的键/值存储来缓存数据集,业务对象,集合,列表等。我们不使用任何文件依赖项,但我们确实使用了时间到期。我们一次只有大约400个用户,所以我们没有做太疯狂的事情。

听起来某种共享/分布式缓存可以帮助解决这个问题,但我不确定使用哪一个或者是否更好地推广我们自己,因为我们不需要大多数可用的功能我见过的产品我见过一些使用WCF的例子,但大多数人建议不要在生产中使用他们的例子,我对WCF知之甚少。

我正在寻找一种简单,快速,轻便,安全的生产方式,并且如果可能的话,最好是免费的但不一定是免费的。它需要在Windows Server 2003和Windows上运行。使用ASP.NET 4.0。

有任何建议或信息吗?

5 个答案:

答案 0 :(得分:12)

简单,快速,轻便,安全的声音,如redis和memcached,可以作为中央缓存非常有效。对于stackoverflow,我们通过BookSleeve(客户端)使用redis,但大多数商店的工作方式类似。还有一个AppFabric缓存,但这要复杂得多。

关键点:

  • 您的数据需要以某种方式序列化
  • 如果您当前正在使用大型对象的缓存(如大型DataTable),则需要考虑带宽影响,或使其更加精细化
  • 您可能会受益于2层缓存(一个本地内存,中央存储为辅助缓存)
  • 这意味着您还需要考虑失效(我们通过redis中的pub / sub API来实现)

答案 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