[更新]缓存管理的帮助类(MemoryCache版,需要.net 4以上)
本来想发布下新版Luke.Net,正好刚刚再次重构了缓存的帮助类这里发布下:
测试代码
[Fact] public void SimpleTest() { ICache< int , string > cacheMenager = MemoryCache< int , string >.Instance; var value = cacheMenager.Get(1, () => 1, TimeSpan.FromSeconds(10)); Assert.Equal(value, 1); value = cacheMenager.Get(1, () => 2, TimeSpan.FromSeconds(10)); Assert.Equal(value, 1); System.Threading.Thread.Sleep(10 * 1000); value = cacheMenager.Get(1, () => 3, TimeSpan.FromSeconds(10)); Assert.Equal(value, 3); } |
接口
public interface ICache<TK,TV> { TV Get<TV>(TK cacheKey, Func<TV> getUncachedValue, DateTimeOffset dateTimeOffset); TV Get<TV>(TK cacheKey, Func<TV> getUncachedValue, TimeSpan timeSpan); void Remove(TK cacheKey); } |
用到的单例类
public class SingletonProvider<T> where T : new () { SingletonProvider() { } public static T Instance { get { return SingletonCreator.instance; } } class SingletonCreator { static SingletonCreator() { } internal static readonly T instance = new T(); } } |
最后是更新后的缓存类,
public class MemoryCache<TK, TV> : ICache<TK, TV> { private ObjectCache _memoryCache; public static MemoryCache<TK, TV> Instance { get { return SingletonProvider<MemoryCache<TK, TV>>.Instance; } } public MemoryCache() : this ( null ) { } public MemoryCache( string name) { _memoryCache = new MemoryCache( string .Format( "{0}-{1}-{2}" , typeof (TK).Name, typeof (TV).Name, name)); } public TV Get<TV>(TK cacheKey, Func<TV> getUncachedValue, DateTimeOffset dateTimeOffset) { if (_memoryCache.Contains(ParseKey(cacheKey))) { return (TV)_memoryCache[ParseKey(cacheKey)]; } else { var v = getUncachedValue(); object o = v; _memoryCache.Set(ParseKey(cacheKey), o, dateTimeOffset); return v; } } public TV Get<TV>(TK cacheKey, Func<TV> getUncachedValue, TimeSpan timeSpan) { return Get(cacheKey, getUncachedValue, new DateTimeOffset(DateTime.UtcNow + timeSpan)); } public void Remove(TK cacheKey) { _memoryCache.Remove(ParseKey(cacheKey)); } private string ParseKey(TK key) { return key.GetHashCode().ToString(); } } |
作者:today4king
出处:https://www.cnblogs.com/jinzhao/archive/2012/07/10/2584839.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2007-07-10 用ftp实现大文件上传
2007-07-10 c# 实现文件浏览功能
2007-07-10 c#实现ftp功能