跟我一起学.NetCore

因MemoryCache闹了个笑话

2021-03-05  本文已影响0人  Code综艺圈

前言

是这么一回事:

我正在苦思一个业务逻辑,捋着我还剩不多的秀发,一时陷入冥想中......

突然聊天图标一顿猛闪,打开一看,有同事语音;

大概意思是:同事把项目中Redis部分缓存换成MemoryCache/Memcached,还强调MemoryCache/Memcached的效率是Redis的2~5倍;

当时我想到的是Memcached,听到的似乎也是,心想:怎么可能,就算有性能差,也不至于那么多;

因为当时同事代码还没提交,然后就陷入讨论ing,最后还是没聊通,我就跑到同事那当面沟通(要去打架吗,不不不,文明人);

沟通中.....,好几分钟过去了,突然同事说:他用的是微软的MemoryCache

虽然从读音上我还没区分出来,但一听微软,我就感觉我成笑话啦;

然后赶紧让同事打开代码,我擦,真成笑话啦,还理直气壮的沟通了好几十分钟。

为什么会那么“理直气壮”?

最后因为MemoryCache成就了一场笑话,那MemoryCacheMemcached有什么区别呢?

这样比较感觉有点勉强,虽然Memcached是分布式的,但也是基于内存的,在数据存储内存的逻辑还是不同的,不过这里不打算讲解源码,我要说应用,哈哈哈。

附加-为什么Redis让同事感觉性能不好

真实场景是这样的,客户端开启多线程频繁读取Redis数据,当访问比较多时,导致Redis读取数据超过20毫秒,对于Web项目来说其实这还好,20毫秒的响应用户根本无法感知。但对于一个高性能要求的服务程序来说,对通讯要求就比较高,所以简单分析了一下拖慢的原因,大概以下两点:

正文

回归正题,既然说到MemoryCache,就来简单聊聊,主要分享在项目实战中如何使用;

主要依赖包:Microsoft.Extensions.Caching.Memory

MemoryCache的使用很简单,就是在调用方法设置和获取值就对啦;来直接看Demo吧;

1. 控制台Demo

其实有很多程序是基于后台服务运行的,并不都是Web,所以写了一个控制台的Demo,方便小伙伴参考;

1.1 引入相关包,项目中使用了Autofac作为依赖注入和其切面编程,则需要引入相关的依赖包,项目结构和包引入如下图:
image-20210303122048613
1.2 编写示例代码及注册相关服务
1.3 两种方式进行缓存处理

通常在非Web程序中,有以下两种方式进行缓存处理:

注:推荐使用面向切面的形式进行处理,这样缓存功能可插拔,代码维护性也好。

2.WebApiDemo(项目名称为:MemoryCacheWebApiDemo)

在WebApi中使用就比较简单啦,关于MemoryCache的依赖包已经集成在框架中,如果需要使用,直接注册服务就可以用啦;通常在WebApi中进行缓存处理的方式有三种:

这里就用过滤器的形式进行Demo演示,走起来~~~

2.1 编写过滤器

缓存如果能在最前面处理,就优先在最前面,所以使用的ResourceFilter过滤器;关于过滤器之前写过一篇文章很详细(跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走),这里就不赘述了。

image-20210303131403185

然后在Startup.cs中注册服务和将自定义过滤器注册即可,如下:

image-20210303131617185

然后启动运行,多次请求调试看看效果(小伙伴自己在过滤器中调试即可);

在WebApi中也可以使用业务层面向切面的方式进行相关业务处理,集成Autofac即可;小伙伴可以参照这篇文章(跟我一起学.NetCore之Asp.NetCore中集成Autofac扩展)。 关于AOP面向切面编程这块,后续单独整理一篇分享;

源码地址:https://github.com/zyq025/DotNetCoreStudyDemo

总结

在一些开发项目中,可能会使用Dictionary进行数据缓存,如果是这样,可以尝试使用MemoryCache,性能合理利用CPU,而且还是线程安全的;另外在高并发场景,可以用其作为多级缓存,因为MemoryCache还能设置过期时间,搭配Redis配合使用,效果杠杠的。

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~

上一篇下一篇

猜你喜欢

热点阅读