net core Webapi基础工程搭建(五)——缓存机制

  • 时间:
  • 浏览:0
  • 来源:大发快三_快三软件_大发快三软件

前言

作为WebApi接口工程,性能速率是必不可少的,每次的访问请求,数据库读取,业务逻辑正确处理都一些耗费时间,偶尔再来个各种花式for循环,那就嗨翻天了,一些公有的数据,访问频繁且大致重复的数据,亲戚亲戚朋友可不前要考虑通过缓存来放置内存存储,以内存空间换取时间上的提升,至于缓存的最好的法律法律依据,Cache,Session,Cookie等,为哪些用等呢,只是还有只是缓存的最好的法律法律依据,如Redis,具体上方用到了会专门介绍。

Cache

net core中还还都后能 不能 Cache,只是它有MemoryCache,我我实在,大差不差,毕竟全部都会Cache。

Cache在项目工程中使用的范围还是挺广泛的:

  • 在我每个人开发的原先 ,我一般会把系统字典做缓存,方便调用提高响应速率
  • 消息推送后,会把消息实体缓存
  • 一些,我每个人看着办吧

首先,引入Microsoft.Extensions.Caching.Memory



这里我直接在Util引入,前面只是讲了,有一1个多多工程引入第三方,一些工程引入项目工程即可使用对应第三方类库。

引入完成后,亲戚亲戚朋友就开始来使用一些MemoryCache吧。

    //实例化
    private static readonly MemoryCache Cache = new MemoryCache(new MemoryCacheOptions());
    /// <summary>
    /// 加进缓存
    /// </summary>
    /// <param name="key">缓存Key</param>
    /// <param name="value">缓存Value</param>
    /// <param name="expiresSliding">滑动过期时长(只是在过期时间内有操作,则以当前时间点延长过期时间)</param>
    /// <param name="expiressAbsoulte">绝对过期时长</param>
    /// <returns></returns>
    public static bool Set(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
    {
        if (key == null)
            throw new ArgumentNullException(nameof(key));
        if (value == null)
            throw new ArgumentNullException(nameof(value));

        Cache.Set(key, value,
            new MemoryCacheEntryOptions().SetSlidingExpiration(expiresSliding)
                .SetAbsoluteExpiration(expiressAbsoulte));
        return Exists(key);
    }

    /// <summary>
    /// 加进缓存
    /// </summary>
    /// <param name="key">缓存Key</param>
    /// <param name="value">缓存Value</param>
    /// <param name="expiresIn">缓存时长</param>
    /// <param name="isSliding">是是否是滑动过期(只是在过期时间内有操作,则以当前时间点延长过期时间)</param>
    /// <returns></returns>
    public static bool Set(string key, object value, TimeSpan expiresIn, bool isSliding = false)
    {
        if (key == null)
            throw new ArgumentNullException(nameof(key));
        if (value == null)
            throw new ArgumentNullException(nameof(value));

        Cache.Set(key, value,
            isSliding
                ? new MemoryCacheEntryOptions().SetSlidingExpiration(expiresIn)
                : new MemoryCacheEntryOptions().SetAbsoluteExpiration(expiresIn));

        return Exists(key);
    }

一些地方大致列下怎么才能 才能 使用,我我实在对于第三方的包,亲戚亲戚朋友封装是为了减少一些开发人员的学习成本,上方的SqlSugar等类库一样,我我实在有有一种第三方只是做了一次封装整合,而亲戚亲戚朋友是只是实际开发前要来针对不同的业务功能做不同的封装整合,接口开放等。

补个测试效果,写到Session才想起来,唉,岂全部都会写东西还还都后能 让打断,-,-||。



注意观察时间,一段时间后Cache过期销毁。

Session

最初鼓捣net core的原先 ,我我我实在还还都后能 不能 很多关注Session一些会话模式,毕竟还还都后能 不能 浏览器都还还都后能 使用,原先 跟别人谈到Session多爽的原先 ,说道Session我我实在本质上同类Cookie(当然我只是清楚),只是用户访问都会有个SessionID,有清况 的访问会留下Cookie也是情有可原的,只是用户我每个人整个隐私模式访问,那,再见(你就在登录界面循环往复吧)。

在用户登录后,Session存储用户基本登录信息一些是web端常用的手段,毕竟跟浏览器打交道Cookie少不了,对于无清况 访问授权的JWT也是折腾过,不过还是理解不透彻,统一的授发token的最好的法律法律依据还是挺可取的,只是是多服务,多应用,负载均衡的场景,单点登录我我实在方便,只是我常规会我每个人生成token来通过Session只是Redis存储,实际效果应该是差很多吧。

好了,废话很多说,一样是引入Microsoft.AspNetCore.Session



引入完成后,在Startup.cs注册Session服务。

        public void ConfigureServices(IServiceCollection services)
        {
            //…原先

的代码
            
            #region Session
            services.AddSession(options =>
            {
                options.Cookie.Name = "April.Session";
                options.IdleTimeout = TimeSpan.FromSeconds(30000);//设置session的过期时间
                options.Cookie.HttpOnly = true;//设置在浏览器还还都后能



通过js获得该cookie的值,实际场景根据自身前要
            });
            #endregion
        }

注册服务后,前要在ConfigConfigure使用,注意所有的Use要在UserMvc原先 都还还都后能 生效。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //…原先

的代码

            app.UseSession();//这里使用

            app.UseHttpsRedirection();
            app.UseMvc();
        }

在Util创建有一1个多多SessionUtil,来封装Session最好的法律法律依据,这里只简单描述下怎么才能 才能 使用,后续代码开源后可查看源码使用。

    public class SessionUtil
    {
        /// <summary>
        /// 设置Session
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        public void SetSession(HttpContext content,string key, string value)
        {
            content.Session.SetString(key, value);
        }
        /// <summary>
        /// 获取Session
        /// </summary>
        /// <param name="key">键</param>
        /// <returns>返回对应的值</returns>
        public string GetSession(HttpContext context, string key, string defaultValue = "")
        {
            string value = context.Session.GetString(key);
            if (string.IsNullOrEmpty(value))
            {
                value = defaultValue;
            }
            return value;
        }
    }

亲戚亲戚朋友依然拿一些万恶的ValuesController开刀。



运行后,访问一些Values/{id}接口,发现亲戚亲戚朋友的Session值只是获取到了。

HttpContext一些对象,可不前要通过IServiceProvider来获取,原先 方便调用统一维护。

新建AprilConfig类文件,代码如下:

    public class AprilConfig
    {
        public static IServiceProvider _provider;

        public static HttpContext HttpCurrent
        {
            get
            {
                object factory = _provider.GetService(typeof(IHttpContextAccessor));
                HttpContext context = ((IHttpContextAccessor)factory).HttpContext;
                return context;
            }
        }
    }

写好后亲戚亲戚朋友前要回到Startup.cs,给IserviceProvider赋值。



SessionUtil代码修改调整,不前要再传HttpContext一些参数。



原先 少传有一1个多多是有一1个多多,后续用到HttpContext一些上下文的原先 ,只是用考虑啥了,直接AprilConfig.HttpCurrent走起。

Cookie在web开发使用的还是相当频繁的,毕竟不占用服务器内存,跟服务器基本上没半毛钱关系,客户端的内存想咋折腾咋折腾,客户端的资源想咋使用咋使用(ps:这只是怎么才能 会会你的电脑还还都后能 不能 卡,软件开发不考虑性能优化的种种结果)。

Cookie有有一种在net core中只是支持,只是不前要引入啥NuGet包。

新建CookieUtil(很多再吐槽我的命名最好的法律法律依据,习惯了)。

public class CookieUtil
    {
        /// <summary>
        /// 设置本地cookie
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="value">值</param>  
        /// <param name="minutes">过期时长,单位:分钟</param>      
        public static void SetCookies(string key, string value, int minutes = 10)
        {
            AprilConfig.HttpCurrent.Response.Cookies.Append(key, value, new CookieOptions
            {
                Expires = DateTime.Now.AddMinutes(minutes)
            });
        }
        /// <summary>
        /// 删除指定的cookie
        /// </summary>
        /// <param name="key">键</param>
        public static void DeleteCookies(string key)
        {
            //一些地方想判断就判断下,不过内部人员封装的最好的法律法律依据应该是只是做过正确处理
            AprilConfig.HttpCurrent.Response.Cookies.Delete(key);
        }

        /// <summary>
        /// 获取cookies
        /// </summary>
        /// <param name="key">键</param>
        /// <returns>返回对应的值</returns>
        public static string GetCookies(string key,string defaultValue="")
        {
            string value = string.Empty;
            AprilConfig.HttpCurrent.Request.Cookies.TryGetValue(key, out value);
            if (string.IsNullOrEmpty(value))
            {
                value = defaultValue;
            }
            return value;
        }
    }

写好原先 ,老规矩ValuesController走一波。



测试结果:

小结

从创建工程到在线文档,日志管理,缓存机制基本上走了一遍了,下一步,只是数据层的操作,有一1个多多工程管理肯定少不了数据的支撑,总还还都后能 每次都我每个人YY数据吧,下一节,数据库操作

补充

针对Session.SetString的最好的法律法律依据还还都后能 不能 疑问,前要引入有一1个多多NuGet包,一些上方涵盖官方的扩展最好的法律法律依据,Microsoft.AspNetCore.Http.Abstractions