圣罩 发表于 2025-5-30 01:20:25

用匿名函数来更方便的使用缓存

一个数据缓存,一般由数据来源,缓存方案,缓存读取来完成,现在有了匿名函数,可以把获取数据来源变为匿名函数。这样就可以直接声明一个缓存:
protected static CacheManager companyCache = new CacheManager(new SmsDatabaseCache(), (key) =>
             {
                 return SmsDatabase.Instance.Context.Company.Where(c => c.ShortNumber == (string)key).SingleOrDefault();
             });SmsDatabaseCache是一个缓存方案,还可以使用SimpleCache,TimeoutCache等实现了ICache接口的类,因为我的ICacheManager从ICache继承,所以还可以实现级连缓存哟,例如:
SmsDatebaseCache是一个依SmsDatabase.Instance.Context的缓存方案,在LinqContextDispose时,会进行清空数据操作。SmsDatabaseCache
    public class SmsDatabaseCache : ICache
    {
        private Dictionary cache = new Dictionary();

        public SmsDatabaseCache()
        {
            SmsDatabase.Instance.PreDisposing += (s, e) =>
                {
                    cache.Clear();
                };
        }

        public TData Get(object key)
        {
            return cache;
        }

        public void Set(object key, TData data)
        {
            cache = data;
        }
  
    }

实现代码如下:缓存代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace Evlon.Utils
{
    public interface ICache
    {
        TData Get(object key);
        void Set(object key, TData data);
    }

    public interface ICacheManager : ICache
    {
        Func SourceGetter { get; }
    }


    public class SimpleCache : ICache
    {
        private Dictionary cache = new Dictionary();



        #region ICacheManager 成员

        public TData Get(object key)
        {
            return cache;
        }

        public void Set(object key, TData data)
        {
            cache = data;
        }

        #endregion
    }


    public class TimeoutCache : ICache
    {
        public TimeSpan Expire {get;set;}
        private DateTime timeLastScan = DateTime.Now;
        private Dictionary cache = new Dictionary();

        public TimeoutCache()
        {
            Expire = TimeSpan.FromMinutes(5);
        }

        private void TryClearExpireObject()
        { 
            TimeSpan ts = DateTime.Now - timeLastScan;
            if (ts.TotalSeconds > Expire.TotalSeconds / 2)
            {
                timeLastScan = DateTime.Now;
                cache.Where(kv => kv.Value.Value  > DateTime.Now.Subtract(Expire)).ToList().ForEach(kv =>
                    {
                        cache.Remove(kv.Key);
                    });
            }
        }

        #region ICacheManager 成员

        public TData Get(object key)
        {
            TryClearExpireObject();

            if(!cache.ContainsKey(key))
                return default(TData);


            KeyValuePair kv = cache;
            if (kv.Value.Add(Expire) 

敕码 发表于 2025-11-29 08:44:47

谢谢楼主提供!

崆蛾寺 发表于 2025-12-2 14:52:59

yyds。多谢分享

战匈琼 发表于 2026-1-15 21:43:23

感谢,下载保存了

咒卖箴 发表于 2026-1-16 20:52:19

谢谢分享,辛苦了

热琢 发表于 2026-1-17 15:05:47

感谢分享,学习下。

蟠鲤 发表于 2026-1-19 01:37:01

感谢分享,学习下。

阮蓄 发表于 2026-1-20 10:31:47

东西不错很实用谢谢分享

坐褐 发表于 2026-1-20 20:01:27

懂技术并乐意极积无私分享的人越来越少。珍惜

剩鹄逅 发表于 2026-1-24 08:52:39

感谢分享

毋献仪 发表于 2026-2-4 05:15:29

收藏一下   不知道什么时候能用到

垢峒 发表于 2026-2-4 06:41:00

谢谢分享,试用一下

幌斛者 发表于 2026-2-4 07:25:13

前排留名,哈哈哈

辈霖利 发表于 2026-2-6 06:01:26

分享、互助 让互联网精神温暖你我

空娅芬 发表于 2026-2-6 20:36:44

鼓励转贴优秀软件安全工具和文档!

史华乐 发表于 2026-2-7 11:32:55

分享、互助 让互联网精神温暖你我

指陡 发表于 2026-2-8 06:35:20

懂技术并乐意极积无私分享的人越来越少。珍惜

尤晓兰 发表于 2026-2-8 09:39:32

yyds。多谢分享

茅香馨 发表于 2026-2-9 05:22:26

感谢分享,下载保存了,貌似很强大

坪钗 发表于 2026-2-9 06:45:35

这个好,看起来很实用
页: [1] 2
查看完整版本: 用匿名函数来更方便的使用缓存