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

6
我们有一台运行 Windows Server 2003 的服务器作为我们的生产 Web 服务器。我们的网站有不同的模块,每个模块都在自己的应用程序池中运行。这使得缓存成为一个问题,因为每个模块都有自己的缓存,而经常有多个模块缓存相同的项。问题是当一个缓存项在一个模块中被修改时,缓存相同项的另一个模块不能轻松地进行刷新。
我们的网站使用 ASP.NET 4.0 编写,使用标准的 HttpRuntime.Cache 对象作为简单的键值存储来缓存数据集、业务对象、集合、列表等等。我们不使用任何文件依赖性,但我们确实使用时间过期。我们同时只有大约 400 个用户在线,所以我们并没有做什么特别复杂的事情。
听起来,一些共享/分布式缓存可以帮助解决这个问题,但我不确定该使用哪个产品,或者是否最好自己开发,因为我们不需要大多数产品中提供的许多功能。我看到一些使用 WCF 的例子,但大多数人建议在生产中不要使用它们的例子,而且我对 WCF 了解甚少。
我正在寻找某种简单、快速、轻量级、安全的缓存,最好是免费的,但不一定要求这样。它需要在 Windows Server 2003 上运行,并与 ASP.NET 4.0 兼容。
有什么建议或信息吗?
5个回答

13

简单,快速,轻量级和安全听起来像Redis和Memcached这样的东西,作为中央缓存非常有效。对于StackOverflow,我们通过BookSleeve(客户端)使用Redis,但大多数存储方式都会类似。还有一个AppFabric缓存,但它比较复杂。

但是,要点如下:

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

谢谢提供信息,你是在Windows还是Unix系统上运行?如果是Windows系统,你使用哪个redis端口?为什么选择redis而不是memcached? - Billy
@Billy 在生产环境中,我们使用*nix作为服务器,因为“fork”允许更有效的后台保存。虽然这对于400个用户来说不太可能是一个问题。我使用dmajkic二进制文件,它们运行良好。关于“为什么”的问题——更多功能:p - Marc Gravell

7

谢谢您的文章,看起来非常有帮助,我会研究他的实现。 - Billy
1
唯一提供分布式缓存的服务提供商是memcached,其他服务提供商并不支持分布式缓存。 - ewahner

3

尝试一下Dache。它是一个开源的.NET分布式缓存解决方案,具有极高的性能。http://www.getdache.net


1
它有双重许可证。对于商业项目,您必须购买许可证。 - Tushar
1
@haney,这个网站现在显示房产列表。我猜这个项目已经不可用了? - chester89

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

0
如果价格不是问题,那么NCache可能是您最好的选择。它的最新版本(NCache 4.1)与.NET 4.0兼容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接