如何创建缓存对象的类

本文关键字:缓存 对象 创建 何创建 | 更新日期: 2023-09-27 18:27:21

我是c#中泛型的新手,我正在尝试创建一个存储区,我的程序的其他部分可以要求它提供模型对象。当时的想法是,如果我的缓存类有这个对象,它会检查它的日期,如果对象不早于10分钟,就会返回它。如果它的年龄超过10分钟,它会从服务器在线下载更新的模型。如果它没有对象,则下载它并返回它

但我在将对象与DateTime配对时遇到了一些问题,使其变得通用。

// model
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        Cache c = new Cache();
        p = c.Get<Person>(p);
    }
}
public class Cache
{
    struct DatedObject<T>
    {
        public DateTime Time { get; set; }
        public T Obj { get; set; }
    }
    List<DatedObject<T>> objects;
    public Cache() 
    {
        objects = new List<DatedObject<T>>();
    }
    public T Get<T>(T obj)
    {
        bool found = false;
        // search to see if the object is stored
        foreach(var elem in objects)
            if( elem.ToString().Equals(obj.ToString() ) )
            {
                // the object is found
                found = true;
                // check to see if it is fresh
                TimeSpan sp = DateTime.Now - elem.Time;
                if( sp.TotalMinutes <= 10 )
                    return elem;
            }

        // object was not found or out of date
        // download object from server
        var ret = JsonConvert.DeserializeObject<T>("DOWNLOADED JSON STRING");
        if( found )
        {
            // redate the object and replace it in list
            foreach(var elem in objects)
                if( elem.Obj.ToString().Equals(obj.ToString() ) )
                {
                    elem.Obj = ret;
                    elem.Time = DateTime.Now;
                }
        }
        else
        {
            // add the object to the list
            objects.Add( new DatedObject<T>() { Time = DateTime.Now, Obj = ret });                
        }
        return ret;
    }
}

如何创建缓存对象的类

查看作为.NET框架一部分可用的内存缓存类http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

您需要添加System.RunTime.Cache程序集作为对应用程序的引用。下面是一个帮助程序类,用于添加项和从缓存中删除它们。

using System;
using System.Runtime.Caching;
public static class CacheHelper
{
    public static void SaveTocache(string cacheKey, object savedItem, DateTime absoluteExpiration)
    {
        MemoryCache.Default.Add(cacheKey, savedItem, absoluteExpiration);
    }
    public static T GetFromCache<T>(string cacheKey) where T : class
    {
        return MemoryCache.Default[cacheKey] as T;
    }
    public static void RemoveFromCache(string cacheKey)
    {
        MemoryCache.Default.Remove(cacheKey);
    }
    public static bool IsIncache(string cacheKey)
    {
        return MemoryCache.Default[cacheKey] != null;
    }
}

这样做的好处是它是线程安全的,并且它可以自动为您处理缓存的过期问题。所以基本上,你所要做的就是检查从MemoryCache中获取的项目是否为null注意但是MemoryCache仅在.NET 4.0+中可用

如果您的应用程序是web应用程序,则使用System.web.Cache而不是MemoryCache。System.Web.Caching自.NET 1.1以来一直可用,您不需要向项目中添加其他引用。这是用于web的相同帮助程序类。

using System.Web;
public static class CacheHelper
{
    public static void SaveTocache(string cacheKey, object savedItem, DateTime absoluteExpiration)
    {
        if (IsIncache(cacheKey))
        {
            HttpContext.Current.Cache.Remove(cacheKey);
        }
        HttpContext.Current.Cache.Add(cacheKey, savedItem, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 10, 0), System.Web.Caching.CacheItemPriority.Default, null);
    }
    public static T GetFromCache<T>(string cacheKey) where T : class
    {
        return HttpContext.Current.Cache[cacheKey] as T;
    }
    public static void RemoveFromCache(string cacheKey)
    {
        HttpContext.Current.Cache.Remove(cacheKey);
    }
    public static bool IsIncache(string cacheKey)
    {
        return HttpContext.Current.Cache[cacheKey] != null;
    }
}

对于这两种模式,还可以使用其他缓存过期策略,例如基于文件路径的缓存,以便在文件更改时缓存自动过期、SQL缓存依赖性(定期轮询SQL服务器以获取更改)、滑动过期或您可以构建自己的缓存。它们真的派上了用场。