在ASP.NET WebAPI 中使用缓存【Redis】
初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单
PM>Install-Package Strathweb.CacheOutput.WebApi2
基础使用
CacheOutput特性
[Route("get")]
[CacheOutput(ClientTimeSpan = 60, ServerTimeSpan = 60)]
public IEnumerable<string> Get()
{
return new string[] { "Tom", "Irving" };
}
以参数为key
[Route("get")]
[CacheOutput(ServerTimeSpan = 50, ExcludeQueryStringFromCacheKey = true)]
public string Get(int id)
{
return DateTime.Now.ToString();
}
Etag头

使用Redis
客户端使用StackExchange.Redis,
Install-Package StackExchange.Redis.StrongName
在Autofac中注册Redis连接
var builder = new ContainerBuilder();
//注册api容器的实现
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
//注册mvc容器的实现
// builder.RegisterControllers(Assembly.GetExecutingAssembly());
//在Autofac中注册Redis的连接,并设置为Singleton
builder.Register(r =>
{
return ConnectionMultiplexer.Connect(DBSetting.Redis);
}).AsSelf().SingleInstance();
var container = builder.Build();
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
通过构造注入即可
/// <summary>
///Redis服务
/// </summary>
public class RedisService : IRedisService
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger(); /// <summary>
///Redis服务
/// </summary>
private readonly ConnectionMultiplexer _connectionMultiplexer; /// <summary>
/// 构造函数
/// </summary>
/// <param name="connectionMultiplexer">Redis服务</param>
public RedisService(ConnectionMultiplexer connectionMultiplexer)
{
_connectionMultiplexer = connectionMultiplexer;
} /// <summary>
/// 根据KEY获得值
/// </summary>
/// <param name="key">key</param>
/// <returns></returns>
public async Task<WebAPIResponse> Get(string key)
{
try
{
var db = _connectionMultiplexer.GetDatabase();
/*
var set = await db.StringSetAsync("name", "irving");
var get = await db.StringGetAsync("name");
*/
return new WebAPIResponse
{
IsError = false,
Msg = string.Empty,
Data = await db.StringGetAsync(key)
};
}
catch (Exception ex)
{
logger.Error(ex, "RedisService Get Exception : " + ex.Message);
return new WebAPIResponse
{
IsError = false,
Msg = string.Empty,
Data = string.Empty
};
}
}
}
CacheOutput与Redis
默认CacheOutput使用System.Runtime.Caching.MemoryCache来缓存数据,可以自定义扩展到DB,Memcached,Redis等;只需要实现IApiOutputCache接口
public interface IApiOutputCache
{
T Get<T>(string key) where T : class;
object Get(string key);
void Remove(string key);
void RemoveStartsWith(string key);
bool Contains(string key);
void Add(string key, object o, DateTimeOffset expiration, string dependsOnKey = null);
}
实现服务
/// <summary>
/// 实现Redis服务
/// </summary>
public class RedisCacheProvider : IApiOutputCache
{
/// <summary>
///Redis服务
/// </summary>
private readonly ConnectionMultiplexer _connectionMultiplexer; /// <summary>
/// 构造函数
/// </summary>
/// <param name="connectionMultiplexer">Redis服务</param>
public RedisCacheProvider(ConnectionMultiplexer connectionMultiplexer)
{
_connectionMultiplexer = connectionMultiplexer;
} public void Add(string key, object o, DateTimeOffset expiration, string dependsOnKey = null)
{
throw new NotImplementedException();
} public IEnumerable<string> AllKeys
{
get { throw new NotImplementedException(); }
} public bool Contains(string key)
{
throw new NotImplementedException();
} public object Get(string key)
{
var db = _connectionMultiplexer.GetDatabase();
return db.StringGet(key);
} public T Get<T>(string key) where T : class
{
throw new NotImplementedException();
} public void Remove(string key)
{
throw new NotImplementedException();
} public void RemoveStartsWith(string key)
{
throw new NotImplementedException();
}
}
注册WebAPIConfig
configuration.CacheOutputConfiguration().RegisterCacheOutputProvider(() => RedisCacheProvider);
或者使用Autofac for Web API
var builder = new ContainerBuilder();
builder.RegisterInstance(new RedisCacheProvider());
config.DependencyResolver = new AutofacWebApiDependencyResolver(builder.Build());
REFER:
Lap around Azure Redis Cachehttp://azure.microsoft.com/blog/2014/06/04/lap-around-azure-redis-cache-preview/
Caching data in Azure Redis Cachehttps://msdn.microsoft.com/en-us/library/azure/dn690521.aspx
ASP.NET Output Cache Provider for Azure Redis Cachehttps://msdn.microsoft.com/en-us/library/azure/dn798898.aspx
How to use caching in ASP.NET Web API?http://stackoverflow.com/questions/14811772/how-to-use-caching-in-asp-net-web-api
Output caching in ASP.NET Web APIhttp://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/
NuGet Package of the Week: ASP.NET Web API Caching with CacheCow and CacheOutputhttp://www.hanselman.com/blog/NuGetPackageOfTheWeekASPNETWebAPICachingWithCacheCowAndCacheOutput.aspx
使用CacheCow和ETag缓存资源http://www.cnblogs.com/fzrain/p/3618887.html
ASP.NET WebApi - Use Redis as CacheManager
http://www.codeproject.com/Tips/825904/ASP-NET-WebApi-Use-Redis-as-CacheManagerRedisReact
https://github.com/ServiceStackApps/RedisReact.Net缓存管理框架CacheManager
http://www.cnblogs.com/JustRun1983/p/CacheManager.html
在ASP.NET WebAPI 中使用缓存【Redis】的更多相关文章
- [转]在ASP.NET WebAPI 中使用缓存【Redis】
初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单 PM>Install-Package Strathweb.CacheOutpu ...
- ASP.Net Core使用分布式缓存Redis从入门到实战演练
一.课程介绍 人生苦短,我用.NET Core!缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力. 所以经常要用到且不会频繁改变且被用户共享的 ...
- 关于ASP.NET WebAPI中HTTP模型的相关思考
对于.NET的分布式应用开发,可以供我们选择的技术和框架比较多,例如webservice,.net remoting,MSMQ,WCF等等技术.对于这些技术很多人都不会陌生,即时没有深入的了解,但是肯 ...
- asp.net mvc5中使用缓存依赖SqlCacheDependency
缓存是用来提高应用性能,降低服务器压力.适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存.使用缓存最麻烦的就是保持源数据和缓存的中的数据一致. 缓存(Cache) ...
- ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存
.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...
- ASP.NET Core 中的缓存
目录 缓存的基本概念 缓存原理 缓存设计 分布式缓存 Memcache 与 Redis 的比较 缓存穿透,缓存击穿,缓存雪崩解决方案 数据一致性 使用内置 MemoryCache 使用分布式缓存 Re ...
- 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)
一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...
- Asp.Net WebAPI 中Cookie 获取操作方式
1. /// <summary> /// 获取上下文中的cookie /// </summary> /// <returns></returns> [H ...
- [翻译] ASP.NET WebAPI 中的异常处理
原文链接:https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/exception-handling 本文介绍 ...
随机推荐
- cesium+ geoserverTerrainProvide+png展示3D高程图展示
一.发布png到geoserver的imagepyramid // translate png to tif epsg:4326 File png = new File(pngPathStr); Bu ...
- KVC
KVC可以修改私有的属性,估计也是底层 操作的.
- Sql Server 分区之后增加新的分区
随着时间的推移,你可能会希望为已分区的表添加额外的分区(例如,可以为每一个新年创建一个新的分区).要增加一个新的分区,可以使用ALTER PARTITION SCHEME和ALTER PARTITIO ...
- 影响google PageRank的因素
1 与pr高的网站做链接: 2 内容质量高的网站链接 3 加入搜索引擎分类目录 4 加入免费开源目录 5 你的链接出现在流量大.知名度高.频繁更新的重要网站上 6 google对PDF格式的文件比较看 ...
- IE6的连接数限制问题
今天解决了一个bug.看似是UI的bug,最后发现IE的设置问题(严格来说,IE6这么做没有问题,因为HTTP协议的规范如此). 先描述一下问题: 有一个页面管理Job,选中一些Job可以Run,每次 ...
- 清空stringbuilder
大家知道对于字符串频繁拼接是使用stringbuilder.Append方法比使用string+=方法效率高很多,但有时需要清空stringbuilder时却不知道怎么清空,因为它没有clear或em ...
- WampServer3.0.4 允许外网访问配置教程
原文地址:http://jingyan.baidu.com/album/acf728fd556c93f8e410a344.html?picindex=1
- Oracle sys和system用户、sysdba 和sysoper系统权限、sysdba和dba角色的区别
sys和system用户区别 1)最重要的区别,存储的数据的重要性不同 sys所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的,由数据库自己 ...
- js常用的地址栏参数获取
用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg ...
- 友盟错误日志分析(转自:COCOACHINA shemy )
在做的项目中,用到了友盟的组件,在没有禁用错误日志上传之前,收集了一些错误日志. 有一些朋友看到了错误日志,却不知道怎么定位到程序的的代码中,实际上,这一步是非常的简单.友盟没有集成.dSYM文件 ...