[更新]缓存管理的帮助类(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博客园博客,原文链接:http://www.cnblogs.com/jinzhao/archive/2012/07/10/2584839.html,如需转载请自行联系原作者

相关文章
|
4月前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
7月前
|
开发框架 .NET 中间件
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
158 7
|
4月前
|
缓存 NoSQL Java
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
|
4月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
112 1
|
4月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
4月前
|
缓存 开发框架 .NET
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
109 1
|
4月前
|
存储 缓存 开发框架
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
|
4月前
.Net Core 中 MemoryCache 使用
.Net Core 中 MemoryCache 使用
105 0
|
5月前
|
设计模式 存储 缓存
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
43 0
|
5月前
|
人工智能 C#
Jvedio:.NET开源功能强大的本地视频管理神器
Jvedio:.NET开源功能强大的本地视频管理神器
252 0

热门文章

最新文章