Cache使用

Posted topsyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    }
                  

 

以上是关于Cache使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使控制台中的视图缓存片段过期?

在每个用户的Rails中使用片段缓存

如何在 Django 中显式重置模板片段缓存?

Apollo 可以从缓存中读取部分片段吗?

vue依赖cache怎么删除

MODx片段:Tweet这个