Cache类

    前面讲到了缓存的一些知识,那么在Asp.Net下给我们提供了何种方法或方式让我们操作缓存呢?这便是这一节我要讲的东西。

    在Asp.Netzhonng 提供了Cache类来操作它。此类提供了很多功能,包括设置依赖项、管理过期和控制缓存对象如何使用内存以便从关键操作中恢复。

    Cache类添加对象到缓存对象中具体使用其Insert和Add方法,这两个方法十分相似,唯一的区别在于Add方法须用于控制所有提供的功能的参数而Insert方法允许某些参数可选,让其使用默认值的参数。

    Add的语法:

    Cache.Add (   KeyName,             //用于引用该项的缓存键

                    KeyValue,              //要添加到缓存的项

                     Dependencies,        //该项的文件依赖项或缓存键依赖项

                     AbsoluteExpiration,//所添加对象将过期并被从缓存中移除的时间

                     SlidingExpiration,  

                    //最后一次访问所添加对象时和该对象过期时之间的时间间隔

                     Priority,   //对象的相对成本,由 CacheItemPriority 枚举表示

                     CacheItemRemovedCallback         ///在从缓存中移除对象时所调用的委托

              )

       Insert的语法同Add相似,但传入的参数是可选的

      • Cache.Inset(KeyName,KeyValue)
      • Cache.Inset(KeyName,KeyValue,Dependencies)
      • Cache.Inset(KeyName,KeyValue,Depedencies,AbsoluteExpiration)
      • Cache.Inset(KeyName,KeyValue,Depedencies,AbsoluteExpiration,SlidingExpiration,Priority,CacheItemRemovedCallback) 

下面来介绍下依赖项(Dependencies

    依赖项是指缓存项和一个时间点,或一个外部对象的关系。若过了某个设计时指定的时间点,或者某个外部对象改变时,缓存项将过期或者从缓存中被移出。我们控制依赖项的外部对象可以是一个文件、目录、文件或目录数组、另一个保存在缓存中的项,或一个保存在缓存中的项的数组。而时间点可以是一个绝对时间也可是一个相对时间。

文件变更依赖

    文件变更依赖是指若某个特定的文件改变,缓存项过期且从缓存中移出。如:

    

         CacheDependency fileDepends  =   new  CacheDependency(Server.MapPath( " XmlFile/Northwind.xml " ));
         Cache.Insert(
" GridViewDataSet " , dsGrid, fileDepends);

    我们首先建立一个与XmlFile文件夹下Northwind.xml的关联项,接着将其放入缓存,当文件发生变化(数据被修改等)时,该缓存将自动实效并从缓存中移出

 

    以上只是针对利用缓存依赖监控某一文件,如果说我们要监控一批文件或目录的话,我们需要将该一批文件或目录放入一个数组中并将其放入缓存,如下:

    

        string[] fileDependsArray = { Server.MapPath("XmlFile/Northwind.xml"),

                                     Server.MapPath("XmlFile/Books.xml") };

        CacheDependency fileDepends = new CacheDependency();

        Cache.Insert("GridViewDataSet", dsGrid, fileDepends)

缓存项依赖

    一个缓存项可依赖于缓存中的其他项。若一个缓存项依赖于一个或多个其他缓存项,则当依赖的任何一个缓存项发生改变时,该项将过期,并从缓存中将其移除。如:

        string [] fileDependsArray  =  { Server.MapPath( " XmlFile/Northwind.xml " )};
       
string [] cacheDependsArray  =  {  " Depend0 " " Depend1 " " Depend2 "  };
        CacheDependency cacheDepends 
=   new  CacheDependency(fileDependsArray, cacheDependsArray);
        Cache.Insert(
" GridViewDataSet " , dsGrid, cacheDepends);

    我们创建了缓存依赖项cacheDepends,当缓存中的任何信息发生变化时则相应的缓存项将自动实效并从缓存中移出。

时间依赖

    缓存项可基于时间实现依赖,可通过向Cache对象的Add或Insert方法传入两个参数玩成。控制时间依赖的两个参数是AbsoluteExpiration和SlidingExpiration。

    语法:

        Cache.Insert(KeyName,KeyValue,Dependencies, AbsoluteExpiration, SlidingExpiration);

    说明:

    如果不需要文件或者缓存项依赖,则Dependencies参数应该设置为null。

    AbsoluteExpiration参数时DateTime类型,它为缓存项定义了一个生命期。该参数值可以是绝对时间,也可以是相对时间(如)

        DateTime expDate  =   new  DataTime( 2006 , 8 , 21 , 13 , 23 , 45 );
        Cache.Insert(
" GridViewDataSet " , dsGrid,  null ,expDate,Cache.NoSlidingExpiration);

        Demo下载

 

转载于:https://www.cnblogs.com/shimeng3344518/archive/2007/05/15/747606.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
``` class LFUCache { private: int capacity; int minFreq; unordered_map<int, pair<int, int>> cache; // key -> {value, freq} unordered_map<int, list<int>::iterator> freqMap; // freq -> iterator of keys unordered_map<int, list<int>> lruMap; // freq -> list of keys public: LFUCache(int capacity) { this->capacity = capacity; minFreq = 0; } int get(int key) { if (cache.count(key) == 0) { return -1; } int value = cache[key].first; int freq = cache[key].second; freqMap.erase(key); lruMap[freq].erase(freqMap[key]); if (lruMap[freq].empty()) { lruMap.erase(freq); if (freq == minFreq) { minFreq++; } } freq++; cache[key] = {value, freq}; lruMap[freq].push_front(key); freqMap[key] = lruMap[freq].begin(); return value; } void put(int key, int value) { if (capacity == 0) { return; } if (cache.count(key) != 0) { cache[key].first = value; get(key); return; } if (cache.size() == capacity) { int keyToRemove = lruMap[minFreq].back(); lruMap[minFreq].pop_back(); freqMap.erase(keyToRemove); cache.erase(keyToRemove); } minFreq = 1; cache[key] = {value, minFreq}; lruMap[minFreq].push_front(key); freqMap[key] = lruMap[minFreq].begin(); } }; ``` LFU Cache的实现使用了三个哈希表: - `cache` 哈希表:存储键值对和对应的频率。 - `freqMap` 哈希表:存储键值对的频率和对应的迭代器。 - `lruMap` 哈希表:存储键值对的频率和对应的链表。 其中,`cache` 哈希表用于快速查找键值对,`freqMap` 哈希表用于快速查找键值对对应的迭代器,`lruMap` 哈希表用于快速查找某个频率对应的键值对。 LFU Cache有两个方法: - `get` 方法:根据键获取值,如果键不存在则返回 -1。同时更新键值对的频率和链表。 - `put` 方法:插入一个键值对。如果键已存在,则更新值和频率;如果容量已满,则删除频率最小的键值对。同时更新最小频率和链表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值