网站建设公司会议网站,昆明专门做网站,昆明企业宣传片制作,分销系统开发哪家好简介缓存是指可以进行高速数据交换的存储器#xff0c;它先于内存与CPU交换数据#xff0c;因此速率很快。由于CPU从内存中读取数据的速度比从磁盘读取快几个数量级#xff0c;并且存在内存中#xff0c;减小了数据库访问的压力#xff0c; 所以缓存几乎每个项目都会用到。… 简介缓存是指可以进行高速数据交换的存储器它先于内存与CPU交换数据因此速率很快。由于CPU从内存中读取数据的速度比从磁盘读取快几个数量级并且存在内存中减小了数据库访问的压力 所以缓存几乎每个项目都会用到。一般常用的有MemoryCache、Redis 今天就给大家带来MemoryCache的使用介绍类别内存缓存过期时间有4种•永不过期•绝对过期时间•相对现在的过期时间•滑动过期时间当然也可以通过这三种过期时间衍生出 滑动窗口绝对过期时间等等官网地址我们也可以查看官方文档 来详细了解MemoryCache 这里就不做过多解读了•MemoryCache地址使用回到刚才的问题 我们来介绍怎么设置过期时间!永不过期就是在我程序发布后只要我们不去清理该缓存该缓存会一直有效/// summary/// 永不过期时间/// /summary
static void NeverExpire()
{_cache.Set(NeverExpire, 1);
}绝对过期时间用的是绝对时间点 可以理解成截止日期static void AbsoluteExpiration(){DateTime time new DateTime(2022, 04, 01, 23, 59, 59);_cache.Set(AbsoluteExpiration, 20220401235959, time);
}相对现在的过期时间相对现在的过期时间就比如说我们设置缓存后的一分钟内有效可以参考我们常见的 短信登录后端随机生成一个验证码并存入redis,并且设置该key的过期时间然后就是校验了发送手机号码和验证码到后台 从redis中取出对应的验证码就行校验如果正确就把该验证码删掉防止可以验证多次static void ExpirationTimeRelativeToThePresent(){_cache.Set(AbsoluteExpiration, 123456, new TimeSpan(0, 0, 60));}滑动过期时间缓存在设定的时间内没有被使用则失效使用后缓存的过期时间重新被刷新static void SlidingExpirationTime(){_cache.Set(SlidingExpirationTime, 3, new MemoryCacheEntryOptions(){SlidingExpiration new TimeSpan(0, 0, 2),AbsoluteExpiration DateTimeOffset.Now.AddMilliseconds(1000)});}我们来看看官网的定义如图所示 !然后再来解释第二个参数MemoryCacheEntryOptions, 设置缓存项的绝对到期日期: 是当前缓存设置后的1000分钟。像我们经常玩的英雄联盟手游 ,我们一天不登陆,缓存的token失效 就要重新登录获取token我们每天都在玩触发了滑动过期时间就不需要每次启动app时登录账号但是 玩了一段时间后发现我们还是需要重新登录我们的账号这个就是滑动过期时间中绝对过期时间获取缓存值ConcurrentDictionaryobject, CacheEntry _entries一个多线程安全的字典类型 其实缓存的本质就是这个字典将所有缓存都放入这个字典中然后通过字典的key(字典的key其实和缓存实体CacheEntry的key值一样)获取CacheEntry实体(CacheEntry实体包含key和value 也就是我们代码中设置的key和value)。static void GetCache(){//方式一_cache.Get(NeverExpire).ToString();//方式二string value ;if (!_cache.TryGetValue(NeverExpire, out value)){throw new Exception(不存在该缓存或者已过期);}
}清除缓存值static void GetCache(){string value ;if (_cache.TryGetValue(NeverExpire, out value)){_cache.Remove(NeverExpire);}
}可能大家发现了我们在移除时根本就不需要value值再去使用临时变量是不是有点痛苦其实C#也考虑到了这个问题那么c#从7.0开始支持弃元弃元不只是书写和语义上的提升它还可以减少内存分配。将上面代码进行一个简化static void GetCache(){if (_cache.TryGetValue(NeverExpire, out _)){_cache.Remove(NeverExpire);}
}完整代码class Program{public static IMemoryCache _cache new MemoryCache(new MemoryCacheOptions());static void Main(string[] args){_cache.Get(NeverExpire).ToString();string value ;if (!_cache.TryGetValue(NeverExpire, out value)){throw new Exception(不存在该缓存或者已过期);}if (_cache.TryGetValue(NeverExpire, out value)){_cache.Remove(NeverExpire);}if (_cache.TryGetValue(NeverExpire, out _)){_cache.Remove(NeverExpire);}}/// summary/// 永不过期时间/// /summarystatic void NeverExpire(){_cache.Set(NeverExpire, 1);}/// summary/// 绝对过期时间/// /summarystatic void AbsoluteExpiration(){DateTime time new DateTime(2022, 04, 01, 23, 59, 59);_cache.Set(AbsoluteExpiration, 20220401235959, time);}/// summary/// 相对现在的过期时间/// /summary/// static void ExpirationTimeRelativeToThePresent(){_cache.Set(AbsoluteExpiration, 123456, new TimeSpan(0, 0, 60));}/// summary/// 滑动过期时间/// /summarystatic void SlidingExpirationTime(){_cache.Set(key3, 3, new MemoryCacheEntryOptions(){SlidingExpiration new TimeSpan(0, 0, 2),AbsoluteExpiration DateTimeOffset.Now.AddMilliseconds(1000)});}}最后大家如果喜欢我的文章还麻烦给个关注并点个赞, 希望net生态圈越来越好