当前位置: 首页 > news >正文

[更新]缓存管理的帮助类(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();
        }
    }

 

相关文章:

  • CXF2.7.7 java.lang.RuntimeException: Cannot create a secure XMLInputFactory
  • C#对象克隆介绍 (转)
  • 使用tpcc-mysql进行性能测试
  • Struts action的单例与多例
  • windows下实现屏幕分享(C#)
  • Urxvt最简配置
  • 解决SecureCRT连接linux终端中文显示乱码
  • 无需重启,让组策略立即生效
  • 接触GitHub的第一次
  • android学习总结(20120721)
  • Java设计模式之依赖倒置原则
  • linux创建逻辑卷(lv)并挂载
  • C语言加密文本
  • [PHP] 代码重用与函数
  • Error处理: “非法字符: \65279”的解决办法
  • 【RocksDB】TransactionDB源码分析
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angular数据绑定机制
  • oschina
  • Redis 中的布隆过滤器
  • 浏览器缓存机制分析
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 日剧·日综资源集合(建议收藏)
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 突破自己的技术思维
  • 微信小程序实战练习(仿五洲到家微信版)
  • 正则表达式
  • 如何用纯 CSS 创作一个货车 loader
  • ​ubuntu下安装kvm虚拟机
  • ​人工智能书单(数学基础篇)
  • #define 用法
  • #控制台大学课堂点名问题_课堂随机点名
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Git) gitignore基础使用
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (三分钟)速览传统边缘检测算子
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • .dwp和.webpart的区别
  • .htaccess 强制https 单独排除某个目录
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET学习全景图
  • @Autowired @Resource @Qualifier的区别
  • @requestBody写与不写的情况
  • [2010-8-30]
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)