在ASP.NET WebAPI 中使用缓存Redis

Posted admans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ASP.NET WebAPI 中使用缓存Redis相关的知识,希望对你有一定的参考价值。

初步看了下CacheCowOutputCache,感觉还是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.RedisInstall-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 Cache
http://azure.microsoft.com/blog/2014/06/04/lap-around-azure-redis-cache-preview/
Caching data in Azure Redis Cache
https://msdn.microsoft.com/en-us/library/azure/dn690521.aspx
ASP.NET Output Cache Provider for Azure Redis Cache
https://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 API
http://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 CacheOutput
http://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-CacheManager
RedisReact
https://github.com/ServiceStackApps/RedisReact
.Net缓存管理框架CacheManager
http://www.cnblogs.com/JustRun1983/p/CacheManager.html


---------------------
作者:Irving
来源:CNBLOGS
原文:https://www.cnblogs.com/Irving/p/4618556.html
版权声明:本文为作者原创文章,转载请附上博文链接!

以上是关于在ASP.NET WebAPI 中使用缓存Redis的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET 中使用 WebAPI 或 MVC 返回 JSON

用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

如何在我的 ASP.NET 核心 WebApi 项目中全局启用 CORS

在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

在 ASP.Net Core 5 WebAPI 中启用 CORS

如何在 Asp.net MVC 中添加 Web Api,然后在同一个应用程序中使用 WebAPI