缓存管理之MemoryCache与Redis的使用
一、.MemoryCache介绍
MemoryCache是.Net Framework 4.0开始提供的内存缓存类,使用该类型可以方便的在程序内部缓存数据并对于数据的有效性进行方便的管理, 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而减轻数据库负载,加快数据读取速度,提升系统的性能。
二、Redis介绍
Redis是一个开源的key-value存储系统,它支持的数据类型包括string(字符串)、 list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希)数据类型的相关操作
三、MemoryCache与Redis的区别
1、性能方面:Redis 只能使用单核(如果确实需要充分使用多核cpu的能力,那么需要在单台服务器上运行多个redis实例(主从部署/集群化部署),并将每个redis实例和cpu内核进行绑定),而 MemoryCache可以使用多核,所以每一个核上Redis在存储小数据时比Memcached性能更高。而存储大数据时,Memcached性能要高于Redis。
2、内存管理方面: MemoryCache使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能 减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除; Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,在Redis中,并不是所有的数据都一直存储在内存中的,当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘。
3、数据持久化支持:Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志。而MemoryCache是不支持数据持久化操作的。
四、本系统中使用MemoryCache和Redis
目标: 1、MemoryCache和Redis使用无缝切换,统一接口,通过配置选择使用MemoryCache还是Redis
2、使用Redis时,减少对Redis的读取(HttpContextAccessor配合Redis使用)
实现:
MemoryCache我们采用EasyCaching(可以从git上获取:https://github.com/dotnetcore/EasyCaching),由于本身提供的接口不满足需求,所以我们直接下载到本地,将EasyCaching.Core和EasyCaching.InMemory添加到项目中,如图所示:
在IEasyCachingProvider添加接口

在EasyCachingAbstractProvider.cs添加代码
public abstract voidBaseRemoveByContain(string contain);

在DefaultInMemoryCachingProvider.Async.cs中添加代码

在IInMemoryCaching.cs中添加接口
int RemoveByContain(string contain);
在InMemoryCaching.cs中实现接口

MemoryCache接口实现:MemoryCacheManager

Redis实现:
CachingDefaults

ILocker

ICacheManager

PerRequestCacheManager

Redis接口实现:Red