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);
如下是一个实例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 }
调用方法
先去缓存中查询是否有数据,有数据就直接取,没有的话就去数据库获取,并把数据存到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); }