数据缓存

从一个存储库获得数据完全可以从性能的角度来看是一个“重”的任务,尤其是当数据库位于远程应用服务器(例如,Web服务调用,调用,远程处理等)或一些特定的数据是经常访问。因此为了减少数据检索工作量及时间你可以使用一个缓存功能

有一些规则,你应该知道的:

使用一个小的时间内的数据缓存和避免为整个应用程序生命周期的高速缓存。

尝试用缓存不会经常变化的数据(例如,字典元素)。

一些数据仓库可以支持事件通知如果数据是应用之外修改(例如,数据就存储在一个文件中)。

除了明显的目标,数据缓存有缺陷(他们都是潜在的情况时,缓存数据过期和应用程序使用的数据不一致):

如果应用程序将扩展到分布式环境(Web场,应用集群),然后每台机器都会有自己的缓存数据的副本。因此,一台机器可以在任何时间修改数据。

多个应用程序可以访问相同的数据仓库。

有很多不同的缓存实现,但它们都有很多共同点。我将用“微软企业库缓存应用程序块”,将你的一种方式简化了缓存功能的使用。

我的缓存功能的实现可以被分为两个主要部分:缓存管理器实用工具及其使用方法。它大量使用匿名方法和泛型方法(新功能。网2)。

缓存服务是一个管理工具,作为一个潜在的缓存API MS单包装的实现。它使一些方法(GetData<t >,添加,删除)。

public delegate T GetCachedObjectDelegate<T><t>();

public sealed class CacheService
{
    #region singletone
    private static CacheService instance;
    private static readonly object instanceSync = new object();
    public static CacheService Current
    {
        get
        {
            if (CacheService.instance == null)
            {
                lock (CacheService.instanceSync)
                {
                    if (CacheService.instance == null)
                    {
                        CacheService.instance = new CacheService();
                    }
                }
            }
            return CacheService.instance;
        }
    }
    private CacheService()
    {
        this.cache = Microsoft.Practices.EnterpriseLibrary.Caching.CacheFactory
            .GetCacheManager();
    }
    #endregion singletone

    private Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager cache;

    public T GetData<T><t>(
            string key, object syncLock,
            TimeSpan timeout, GetCachedObjectDelegate<T><t> getCachedObject
        )
    {
        return this.GetData<t>(key, syncLock, null, timeout, getCachedObject);
    }
    public T GetData<t><T>(
            string key, object syncLock, 
            ICacheItemRefreshAction refreshAction,
            TimeSpan timeout, GetCachedObjectDelegate<T><t> getCachedObject)
    {
        object result = this.cache.GetData(key);
        if (result == null)
        {
            lock (syncLock)
            {
                result = this.cache.GetData(key);
                if (result == null)
                {
                    result = getCachedObject();
                    this.cache.Add(
                     key,
                     result,
                     CacheItemPriority.Normal,
                     refreshAction,
                     new SlidingTime(timeout)
                );
            }
        }
        return (T)result;
    }
    public void Add(
            string key, object value, 
            CacheItemPriority scavengingPriority, 
            ICacheItemRefreshAction refreshAction, 
            params ICacheItemExpiration[] expirations)
    {
        this.cache.Add(key, value, scavengingPriority, refreshAction, expirations);
    }
    public void Remove(string key)
    {
        this.cache.Remove(key);
    }
}

正如你看到的,这个管理器做了如下工作:

它隐藏了实现代码

对缓存功能工作提出了非常直观的方法。

这里是一个简单的使用

private const string GET_GOOD_INFO_BY_ID = 
        "GoodService.GoodInfo.GET_GOOD_INFO_BY_ID_";
private const double GET_GOOD_INFO_BY_ID_CACHE_INTERVAL = 0.2 * 60;
private static readonly object GET_GOOD_INFO_BY_ID_SINC_KEY = new object();

public GoodInfoModel GetGoodInfoByID(Guid id)
{
    string key = String.Concat(GoodService.GET_GOOD_INFO_BY_ID, id.ToString());
    return CacheService.Current.GetData<goodinfomodel>(
        key,
        GoodService.GET_GOOD_INFO_BY_ID_SINC_KEY,
        TimeSpan.FromSeconds(GoodService.GET_GOOD_INFO_BY_ID_CACHE_INTERVAL),
        delegate
        {
            return GoodDAL.GetGoodInfoByID(id);
        }
    );
}

原文地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值