我正在开发asp.net 4 web项目,该项目是用3个子项目构建的:
该项目托管在单个Windows服务器32位
上我目前正在使用ASP.NET Cache(HttpRuntime.Cache)来缓存对象,但问题是我无法在前端和后台之间共享缓存。管理网站。
通过阅读StackOverflow和其他帖子,我了解到存在以下选项:
我正在寻找免费/非付费解决方案来取代asp.net缓存。
我想得到一些关于:
的意见Windows安装兼容性
效果
易于使用(替换现有的缓存代码)& .NET API。
其他替代方案?
答案 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