南京做网站优化,行政单位网站信息建设政策,做网站拿来卖,seo数据前言是这么一回事#xff1a;我正在苦思一个业务逻辑#xff0c;捋着我还剩不多的秀发#xff0c;一时陷入冥想中……突然聊天图标一顿猛闪#xff0c;打开一看#xff0c;有同事语音#xff1b;大概意思是#xff1a;同事把项目中Redis部分缓存换成MemoryCache/Memcach… 前言是这么一回事我正在苦思一个业务逻辑捋着我还剩不多的秀发一时陷入冥想中……突然聊天图标一顿猛闪打开一看有同事语音大概意思是同事把项目中Redis部分缓存换成MemoryCache/Memcached还强调MemoryCache/Memcached的效率是Redis的2~5倍当时我想到的是Memcached听到的似乎也是心想怎么可能就算有性能差也不至于那么多因为当时同事代码还没提交然后就陷入讨论ing最后还是没聊通我就跑到同事那当面沟通(要去打架吗不不不文明人)沟通中…..好几分钟过去了突然同事说他用的是微软的MemoryCache虽然从读音上我还没区分出来但一听微软我就感觉我成笑话啦然后赶紧让同事打开代码我擦真成笑话啦还理直气壮的沟通了好几十分钟。为什么会那么“理直气壮”对Memcached(听错的)性能高于Redis的2~5倍产生重大怀疑经验告诉我不可能除非Redis用法有问题同事把Redis换成Memcached(听错的)那肯定不行的前期的技术选型Memcached不太符合项目应用场景最后因为MemoryCache成就了一场笑话那MemoryCache和Memcached有什么区别呢MemoryCache不是分布式缓存是基于程序存储在内存中的是微软封装好的内存缓存库合理利用CPU性能好由于基于程序分配内存使用时避免了网络通讯的消耗。Memcached是分布式缓存是存储在公共机器上的供不同程序使用的存在一定的网络传输消耗。这样比较感觉有点勉强虽然Memcached是分布式的但也是基于内存的在数据存储内存的逻辑还是不同的不过这里不打算讲解源码我要说应用哈哈哈。附加-为什么Redis让同事感觉性能不好真实场景是这样的客户端开启多线程频繁读取Redis数据当访问比较多时导致Redis读取数据超过20毫秒对于Web项目来说其实这还好20毫秒的响应用户根本无法感知。但对于一个高性能要求的服务程序来说对通讯要求就比较高所以简单分析了一下拖慢的原因大概以下两点客户端增多导致一个常用Key对应的数据变大(其实不大只是相对大稍微影响了读取速度毫秒级别)解决方案同事使用MemoryCache多做一层缓存将这个常用Key直接存在内存中提高读取性能使用类似于Keys * 的命令频繁获取数据导致有些命令执行在20毫秒左右(慢日志中可以看到)解决方案改用Scan类似命令获取数据Redis自身的持久化耗时解决方案适当调整Redis持久化策略让持久化频率没那么高正文回归正题既然说到MemoryCache就来简单聊聊主要分享在项目实战中如何使用主要依赖包Microsoft.Extensions.Caching.MemoryMemoryCache的使用很简单就是在调用方法设置和获取值就对啦来直接看Demo吧1. 控制台Demo其实有很多程序是基于后台服务运行的并不都是Web所以写了一个控制台的Demo方便小伙伴参考1.1 引入相关包项目中使用了Autofac作为依赖注入和其切面编程则需要引入相关的依赖包项目结构和包引入如下图1.2 编写示例代码及注册相关服务IUserService就是简单接口接口和方法上标注的Intercept和MyCache特性不是必须的接下来会说UserService对接口的实现MyCacheAttribute自定义特性用于标识里面没有任何逻辑处理MyInterceptor自定义拦截器面向切面的逻辑代码在这里处理代码完了就开始使用Autofac注册服务进行使用啦如下注Autofac不是必须的根据自己需要进行选择使用这里是为了要使用Autofac的切面编程功能。1.3 两种方式进行缓存处理通常在非Web程序中有以下两种方式进行缓存处理代码嵌入到业务逻辑在真实业务逻辑处进行缓存获取或设置这样很大一个缺点是每一个缓存的数据都需要手动到指定业务逻辑中添加缓存处理代码后期不好维护缓存功能的开启和关闭也不好控制需要修改代码进行满足。面向切面编程无需嵌入多余代码到业务中通过面向切面的思想以动态代理的原理拦截方法在方法前后进行处理如下缓存逻辑直接放在拦截器中处理即可如下注册服务时开启Autofac的面向切面功能即可运行看效果第二次都是从缓存中获取数据美美哒注推荐使用面向切面的形式进行处理这样缓存功能可插拔代码维护性也好。2.WebApiDemo(项目名称为MemoryCacheWebApiDemo)在WebApi中使用就比较简单啦关于MemoryCache的依赖包已经集成在框架中如果需要使用直接注册服务就可以用啦通常在WebApi中进行缓存处理的方式有三种中间件形式通过自定义中间件进行缓存逻辑操作过滤器形式使用MVC相关过滤器进行缓存逻辑操作业务层面向切面形式面向切面的方式在业务层做缓存集成Autofac即可和控制台Demo的面向切面一样这里就用过滤器的形式进行Demo演示走起来~~~2.1 编写过滤器缓存如果能在最前面处理就优先在最前面所以使用的ResourceFilter过滤器关于过滤器之前写过一篇文章很详细(跟我一起学.NetCore之MVC过滤器这篇看完走路可以仰着头走)这里就不赘述了。然后在Startup.cs中注册服务和将自定义过滤器注册即可如下然后启动运行多次请求调试看看效果小伙伴自己在过滤器中调试即可在WebApi中也可以使用业务层面向切面的方式进行相关业务处理集成Autofac即可小伙伴可以参照这篇文章(跟我一起学.NetCore之Asp.NetCore中集成Autofac扩展)。关于AOP面向切面编程这块后续单独整理一篇分享源码地址https://github.com/zyq025/DotNetCoreStudyDemo总结在一些开发项目中可能会使用Dictionary进行数据缓存如果是这样可以尝试使用MemoryCache性能合理利用CPU而且还是线程安全的另外在高并发场景可以用其作为多级缓存因为MemoryCache还能设置过期时间搭配Redis配合使用效果杠杠的。一个被程序搞丑的帅小伙关注Code综艺圈跟我一起学~~~