ASP.NET - 多个Web应用程序 - 共享缓存对象

时间:2013-12-16 20:03:53

标签: asp.net .net caching redis memcached

我正在开发asp.net 4 web项目,该项目是用3个子项目构建的:

  • Site.Admin - 管理网站 - ASP.NET项目
  • Site.Core - DB& BL - C#Library
  • Site.Web - 前端网站。 - ASP.NET项目

该项目托管在单个Windows服务器32位

我目前正在使用ASP.NET Cache(HttpRuntime.Cache)来缓存对象,但问题是我无法在前端和后台之间共享缓存。管理网站。

通过阅读StackOverflow和其他帖子,我了解到存在以下选项:

  1. Memcached - 没有稳定的Windows版本?
  2. Couchbase - 没有免费版本? overkill取代asp.net缓存?
  3. AppFabric的
  4. Redis - 没有稳定的Windows版本?
  5. 我正在寻找免费/非付费解决方案来取代asp.net缓存。

    我想得到一些关于:

    的意见
    1. Windows安装兼容性

    2. 效果

    3. 易于使用(替换现有的缓存代码)& .NET API。

    4. 其他替代方案?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我们选择了AppFabric。我们需要在同一台服务器上的两个Web应用程序之间共享缓存。

AppFabric非常容易在Windows机器上安装,并且可以通过调用AppFabric来替换对运行时缓存的调用。但是非常重要您决定 您计划如何使用此缓存,或者多少次。

在客户的项目中,我们需要在遗留应用程序旁边构建一个额外的应用程序,而不知道这个遗留应用程序处理运行时缓存的次数。显然,只有在切换到AppFabric之后才变得明显,缓存根本没有正确使用。现在这变得非常明显,因为对AppFabric的调用比将对象放入运行时缓存要慢得多(AppFabric使用WCF与Web应用程序通信,其中运行时缓存直接将对象放入内存中)。 AppFabric并不慢,但它明显慢于运行时缓存,所以明智地使用。

但是这个遗留应用程序向缓存发送了数千个调用(是的,我知道)。因此,只需运行几个测试,这是否适用于您的情况。

答案 1 :(得分:-1)

基本上,您可以将Web api服务创建为缓存对象的存储库。

简单且使用泛型的解决方案,您可以将缓存用于不同的对象类型。

一旦创建了web.api,便要执行一些步骤。

1)创建与Redis服务器的连接字符串

"ConnectionStrings": {
   "Redis": "127.0.0.1:6379"
}

2)修改startup.cs

public void ConfigureServices(IServiceCollection services)
{
   // add redis cache service
   services.AddDistributedRedisCache(options => {
   options.Configuration = Configuration.GetConnectionString("Redis");
   options.InstanceName = "User_";
   });

   services.AddSession();
   services.AddMvc();
}

3)创建一个与您的缓存实例进行交互的类

namespace CacheRepository
{
// declare the class
public static class RedisCache
{

// save 
public static async Task SetObjectAsync<T>(IDistributedCache cache, string key, T value)
{
await cache.SetStringAsync(key, JsonConvert.SerializeObject(value));
}

// get
public static async Task<T> GetObjectAsync<T>(IDistributedCache cache, string key)
{
var value = await cache.GetStringAsync(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}

// verify if an object exists
public static async Task<bool> ExistObjectAsync<T>(IDistributedCache cache, string key)
{
var value = await cache.GetStringAsync(key);
return value == null ? false : true;
}
}
}

4)创建一个控制器,以公开的方法使用相对的http动词

// GET api/values
[HttpGet("{name}")]
public async Task<User> GetUser(string name)
{
  User user = new User();
  try
  {
    if (!string.IsNullOrEmpty(name))
    {
     user = await RedisCache.GetObjectAsync<User>(_Cache, name);
    }
  }
  catch (Exception ex)
  {
    throw ex;
  }
  return user;
}

这是一种简单的方法;)

在下面,您可以找到描述每个细节的文章。

https://medium.com/@massimomannoni/code-web-api-with-redis-distributed-cache-6598dbe854d5

感谢Massimo