zoukankan      html  css  js  c++  java
  • Cache使用

    网站优化第一步,就是使用缓存

    缓存优点:速度快。

    缓存缺点:数据可能丢失,只能做缓存,而不是存储

    .net缓存都继承自ObjectCache

    ObjectCache 的API

      1    // 摘要:
      2     //     表示一个对象缓存并提供用于访问该对象缓存的基方法和属性。
      3     public abstract class ObjectCache : IEnumerable<KeyValuePair<string, object>>, IEnumerable
      4     {
      5         // 摘要:
      6         //     获取一个值,该值指示某个缓存项没有绝对过期。
      7         //
      8         // 返回结果:
      9         //     已设置为可能的最大值的日期时间值。
     10         public static readonly DateTimeOffset InfiniteAbsoluteExpiration;
     11         //
     12         // 摘要:
     13         //     指示某个缓存项没有可调过期时间。
     14         //
     15         // 返回结果:
     16         //     设置为零的持续时间值。
     17         public static readonly TimeSpan NoSlidingExpiration;
     18 
     19         // 摘要:
     20         //     从派生类中的构造函数进行调用以便初始化 System.Runtime.Caching.ObjectCache 类。
     21         [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
     22         protected ObjectCache();
     23 
     24         // 摘要:
     25         //     在派生类中重写时,获取缓存实现所提供的功能的说明。
     26         //
     27         // 返回结果:
     28         //     标志的按位组合,这些标志指示缓存实现的默认功能。
     29         public abstract DefaultCacheCapabilities DefaultCacheCapabilities { get; }
     30         //
     31         // 摘要:
     32         //     获取或设置对托管宿主环境的引用,该环境对 System.Runtime.Caching.ObjectCache 实现可用并且可以为 System.Runtime.Caching.ObjectCache
     33         //     实现提供特定于宿主的服务。
     34         //
     35         // 返回结果:
     36         //     对缓存识别托管宿主环境的引用。
     37         //
     38         // 异常:
     39         //   System.ArgumentNullException:
     40         //     为属性分配的值为 null。
     41         //
     42         //   System.InvalidOperationException:
     43         //     已尝试多次设置该属性值。
     44         public static IServiceProvider Host { get; set; }
     45         //
     46         // 摘要:
     47         //     获取某个特定 System.Runtime.Caching.ObjectCache 实例的名称。
     48         //
     49         // 返回结果:
     50         //     某个特定缓存实例的名称。
     51         public abstract string Name { get; }
     52 
     53         // 摘要:
     54         //     获取或设置 System.Runtime.Caching.ObjectCache 类的默认索引器。
     55         //
     56         // 参数:
     57         //   key:
     58         //     缓存中的缓存项的唯一标识符。
     59         //
     60         // 返回结果:
     61         //     用作该缓存实例的索引器的键。
     62         public abstract object this[string key] { get; set; }
     63 
     64         // 摘要:
     65         //     在派生类中重写时,尝试以 System.Runtime.Caching.CacheItem 实例的形式将缓存项插入缓存中,并添加有关应如何逐出该项的详细信息。
     66         //
     67         // 参数:
     68         //   item:
     69         //     要添加的对象。
     70         //
     71         //   policy:
     72         //     一个包含该缓存项的逐出详细信息的对象。此对象提供比简单绝对过期更多的逐出选项。
     73         //
     74         // 返回结果:
     75         //     如果插入成功,则为 true;如果缓存中已存在具有与 item 相同的键的项,则为 false。
     76         public virtual bool Add(CacheItem item, CacheItemPolicy policy);
     77         //
     78         // 摘要:
     79         //     在派生类中重写时,向缓存中插入缓存项,同时指定有关如何逐出该项的信息。
     80         //
     81         // 参数:
     82         //   key:
     83         //     该缓存项的唯一标识符。
     84         //
     85         //   value:
     86         //     要插入的对象。
     87         //
     88         //   policy:
     89         //     一个包含该缓存项的逐出详细信息的对象。此对象提供比简单绝对过期更多的逐出选项。
     90         //
     91         //   regionName:
     92         //     可选。缓存中的一个可用来添加缓存项的命名区域(如果实现了区域)。可选参数的默认值为 null。
     93         //
     94         // 返回结果:
     95         //     如果尝试插入成功,则为 true;如果缓存中已存在具有与 key 相同的键的项,则为 false。
     96         public virtual bool Add(string key, object value, CacheItemPolicy policy, string regionName = null);
     97         //
     98         // 摘要:
     99         //     在派生类中重写时,向缓存中插入缓存项,而不会覆盖任何现有的缓存项。
    100         //
    101         // 参数:
    102         //   key:
    103         //     该缓存项的唯一标识符。
    104         //
    105         //   value:
    106         //     要插入的对象。
    107         //
    108         //   absoluteExpiration:
    109         //     缓存项的固定的过期日期和时间。当调用 Overload:System.Runtime.Caching.ObjectCache.Add 方法时,此参数是必需的。
    110         //
    111         //   regionName:
    112         //     可选。缓存中的一个可用来添加缓存项的命名区域(如果实现了区域)。由于未在 中实现区域,因此默认值为 null。
    113         //
    114         // 返回结果:
    115         //     如果插入成功,则为 true;如果缓存中已存在具有与 key 相同的键的项,则为 false。
    116         public virtual bool Add(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null);
    117         //
    118         // 摘要:
    119         //     在派生类中重写时,向缓存中插入指定的 System.Runtime.Caching.CacheItem 对象,同时指定有关如何逐出该项的信息。
    120         //
    121         // 参数:
    122         //   value:
    123         //     要插入的对象。
    124         //
    125         //   policy:
    126         //     一个包含该缓存项的逐出详细信息的对象。此对象提供比简单绝对过期更多的逐出选项。
    127         //
    128         // 返回结果:
    129         //     如果存在具有相同键的缓存项,则为指定的缓存项;否则为 null。
    130         public abstract CacheItem AddOrGetExisting(CacheItem value, CacheItemPolicy policy);
    131         //
    132         // 摘要:
    133         //     在派生类中重写时,向缓存中插入缓存项,并指定该缓存项的键和值以及有关如何逐出该项的信息。
    134         //
    135         // 参数:
    136         //   key:
    137         //     该缓存项的唯一标识符。
    138         //
    139         //   value:
    140         //     要插入的对象。
    141         //
    142         //   policy:
    143         //     一个包含该缓存项的逐出详细信息的对象。此对象提供比简单绝对过期更多的逐出选项。
    144         //
    145         //   regionName:
    146         //     可选。缓存中的一个可用来添加缓存项的命名区域(如果实现了区域)。可选参数的默认值为 null。
    147         //
    148         // 返回结果:
    149         //     如果存在具有相同键的缓存项,则为指定缓存项的值;否则为 null。
    150         public abstract object AddOrGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null);
    151         //
    152         // 摘要:
    153         //     在派生类中重写时,通过使用键、表示缓存项的对象、绝对过期值和要添加缓存的可选区域,向缓存中插入缓存项。
    154         //
    155         // 参数:
    156         //   key:
    157         //     该缓存项的唯一标识符。
    158         //
    159         //   value:
    160         //     要插入的对象。
    161         //
    162         //   absoluteExpiration:
    163         //     缓存项的固定的过期日期和时间。
    164         //
    165         //   regionName:
    166         //     可选。缓存中的一个可用来添加缓存项的命名区域(如果实现了区域)。可选参数的默认值为 null。
    167         //
    168         // 返回结果:
    169         //     如果存在具有相同键的缓存项,则为指定缓存项的值;否则为 null。
    170         public abstract object AddOrGetExisting(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null);
    171         //
    172         // 摘要:
    173         //     在派生类中重写时,检查缓存中是否已存在该缓存项。
    174         //
    175         // 参数:
    176         //   key:
    177         //     该缓存项的唯一标识符。
    178         //
    179         //   regionName:
    180         //     可选。缓存中包含该缓存项的命名区域(如果实现了区域)。可选参数的默认值为 null。
    181         //
    182         // 返回结果:
    183         //     如果缓存中包含具有与 key 相同的键值的缓存项,则为 true;否则为 false。
    184         public abstract bool Contains(string key, string regionName = null);
    185         //
    186         // 摘要:
    187         //     在派生类中重写时,创建一个 System.Runtime.Caching.CacheEntryChangeMonitor 对象,该对象可触发事件以响应对指定缓存项的更改。
    188         //
    189         // 参数:
    190         //   keys:
    191         //     要监视的缓存项的唯一标识符。
    192         //
    193         //   regionName:
    194         //     可选。缓存中包含 keys 参数中的缓存键的命名区域(如果实现了区域)。可选参数的默认值为 null。
    195         //
    196         // 返回结果:
    197         //     用于监视缓存中的缓存项的更改监视器。
    198         public abstract CacheEntryChangeMonitor CreateCacheEntryChangeMonitor(IEnumerable<string> keys, string regionName = null);
    199         //
    200         // 摘要:
    201         //     在派生类中重写时,以对象的形式获取缓存中的指定缓存项。
    202         //
    203         // 参数:
    204         //   key:
    205         //     要获取的缓存项的唯一标识符。
    206         //
    207         //   regionName:
    208         //     可选。缓存中添加了缓存项的命名区域(如果实现了区域)。可选参数的默认值为 null。
    209         //
    210         // 返回结果:
    211         //     由 key 标识的缓存项。
    212         public abstract object Get(string key, string regionName = null);
    213         //
    214         // 摘要:
    215         //     在派生类中重写时,以 System.Runtime.Caching.CacheItem 实例的形式获取缓存中的指定缓存项。
    216         //
    217         // 参数:
    218         //   key:
    219         //     要获取的缓存项的唯一标识符。
    220         //
    221         //   regionName:
    222         //     可选。缓存中添加了缓存项的命名区域(如果实现了区域)。由于未在 中实现区域,因此默认值为 null。
    223         //
    224         // 返回结果:
    225         //     由 key 标识的缓存项。
    226         public abstract CacheItem GetCacheItem(string key, string regionName = null);
    227         //
    228         // 摘要:
    229         //     在派生类中重写时,获取缓存中的缓存项总数。
    230         //
    231         // 参数:
    232         //   regionName:
    233         //     可选。缓存中应计算其缓存项数的命名区域(如果实现了区域)。可选参数的默认值为 null。
    234         //
    235         // 返回结果:
    236         //     缓存中的缓存项数。如果 regionName 不为 null,则计数指示指定的缓存区域中的项数。
    237         public abstract long GetCount(string regionName = null);
    238         //
    239         // 摘要:
    240         //     在派生类中重写时,创建可用于循环访问缓存项的集合的枚举器。
    241         //
    242         // 返回结果:
    243         //     可提供对缓存中的缓存项的访问的枚举器对象。
    244         protected abstract IEnumerator<KeyValuePair<string, object>> GetEnumerator();
    245         //
    246         // 摘要:
    247         //     在派生类中重写时,获取与指定键对应的一组缓存项。
    248         //
    249         // 参数:
    250         //   keys:
    251         //     要获取的缓存项的唯一标识符集合。
    252         //
    253         //   regionName:
    254         //     可选。缓存中添加了一个或多个缓存项的命名区域(如果实现了区域)。可选参数的默认值为 null。
    255         //
    256         // 返回结果:
    257         //     一个表示缓存项的键/值对字典。
    258         public abstract IDictionary<string, object> GetValues(IEnumerable<string> keys, string regionName = null);
    259         //
    260         // 摘要:
    261         //     获取与指定的键对应的一组缓存项。
    262         //
    263         // 参数:
    264         //   regionName:
    265         //     可选。缓存中添加了一个或多个缓存项的命名区域(如果实现了区域)。由于未在 中实现区域,因此默认值为 null。
    266         //
    267         //   keys:
    268         //     要获取的缓存项的唯一标识符集合。
    269         //
    270         // 返回结果:
    271         //     一个表示缓存项的键/值对字典。
    272         [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    273         public virtual IDictionary<string, object> GetValues(string regionName, params string[] keys);
    274         //
    275         // 摘要:
    276         //     在派生类中重写时,从缓存中移除缓存项。
    277         //
    278         // 参数:
    279         //   key:
    280         //     该缓存项的唯一标识符。
    281         //
    282         //   regionName:
    283         //     可选。缓存中添加了缓存项的命名区域(如果实现了区域)。可选参数的默认值为 null。
    284         //
    285         // 返回结果:
    286         //     一个对象,表示由该键指定的已移除缓存项的值;如果找不到指定的项,则为 null。
    287         public abstract object Remove(string key, string regionName = null);
    288         //
    289         // 摘要:
    290         //     在派生类中重写时,以 System.Runtime.Caching.CacheItem 实例的形式向缓存中插入缓存项,同时指定有关如何逐出该项的信息。
    291         //
    292         // 参数:
    293         //   item:
    294         //     要添加的缓存项。
    295         //
    296         //   policy:
    297         //     一个包含该缓存项的逐出详细信息的对象。此对象提供比简单绝对过期更多的逐出选项。
    298         public abstract void Set(CacheItem item, CacheItemPolicy policy);
    299         //
    300         // 摘要:
    301         //     在派生类中重写时,向缓存中插入缓存项。
    302         //
    303         // 参数:
    304         //   key:
    305         //     该缓存项的唯一标识符。
    306         //
    307         //   value:
    308         //     要插入的对象。
    309         //
    310         //   policy:
    311         //     一个包含该缓存项的逐出详细信息的对象。此对象提供比简单绝对过期更多的逐出选项。
    312         //
    313         //   regionName:
    314         //     可选。缓存中的一个可用来添加缓存项的命名区域(如果实现了区域)。可选参数的默认值为 null。
    315         public abstract void Set(string key, object value, CacheItemPolicy policy, string regionName = null);
    316         //
    317         // 摘要:
    318         //     在派生类中重写时,向缓存中插入缓存项,同时指定基于时间的过期详细信息。
    319         //
    320         // 参数:
    321         //   key:
    322         //     该缓存项的唯一标识符。
    323         //
    324         //   value:
    325         //     要插入的对象。
    326         //
    327         //   absoluteExpiration:
    328         //     缓存项的固定的过期日期和时间。
    329         //
    330         //   regionName:
    331         //     可选。缓存中的一个可用来添加缓存项的命名区域(如果实现了区域)。可选参数的默认值为 null。
    332         public abstract void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null);
    View Code

    如下是一个实例demo

     1   public class TopsCache
     2     {
     3         public static MemoryCache Cache = MemoryCache.Default;
     4         /// <summary>
     5         /// 默认过期日期5分钟
     6         /// </summary>
     7         /// <param name="key"></param>
     8         /// <param name="value"></param>
     9         public static void Set(string key, object value)
    10         {
    11             Cache.Set(key, value, DateTime.Now.AddMinutes(5));
    12         }
    13         /// <summary>
    14         /// 
    15         /// </summary>
    16         /// <param name="key">key</param>
    17         /// <param name="value">value</param>
    18         /// <param name="Minutes">过期时间</param>
    19         public static void Set(string key, object value,int Minutes)
    20         {
    21             Cache.Set(key, value, DateTime.Now.AddMinutes(Minutes));
    22         }
    23         /// <summary>
    24         /// 根据key获取value
    25         /// </summary>
    26         /// <typeparam name="T"></typeparam>
    27         /// <param name="key"></param>
    28         /// <returns></returns>
    29         public static T Get<T>(string key)
    30         {
    31             T t1=(T)Cache.Get(key);
    32             return t1;
    33         }
    34         /// <summary>
    35         /// 
    36         ///     确定缓存中是否存在某个缓存项。
    37         /// 
    38         /// 参数:
    39         ///   key:
    40         ///     要搜索的缓存项的唯一标识符。
    41         /// </summary>
    42         /// <param name="key"></param>
    43         /// <returns></returns>
    44         public static bool Contains(string key)
    45         {
    46             return Cache.Contains(key);
    47         }
    48     }
    View Code

    调用方法

    先去缓存中查询是否有数据,有数据就直接取,没有的话就去数据库获取,并把数据存到Cache中。

     DataTable dt = Query.ProcessSql(sql, GlobalVar.DATABASENAME);
    
    
     if (TopsCache.Contains(sql))
        {
            dt = TopsCache.Get<DataTable>(sql);
         }
       else
       {
        dt = Query.ProcessSql(sql, GlobalVar.DATABASENAME);
        TopsCache.Set(sql, dt_qf);
        }
                      
  • 相关阅读:
    分部视图
    linq的几个方法
    如何让服务器支持mp4文件下载和sqlserver将表生成为sql语句方法
    在asp.net mvc中导出Excel文件
    Linq2EF操作中的两个小问题
    JSON到底是什么?
    连接跟踪(conntrack):原理、应用及 Linux 内核实现 转载
    没有安全,没有隐私
    互联网发展到今天,我们要做的,是用机器解决人类解决不了的问题。在这个意义上,比起人工智能,机器智能这个词更加准确。
    今天,世界各国城市的可持续发展面临很大挑战,这些挑战也带来了一个难得的机遇,就是利用机器智能解决城市发展过程中许多重要的问题,如交通治理。同时这也是像机器智能这样的新一代技术快速发展的机遇,这正是我全身心推动城市大脑的原因
  • 原文地址:https://www.cnblogs.com/topsyuan/p/12650339.html
Copyright © 2011-2022 走看看