C# Cache缓存的应用
缓存类Cache的使用
直接先上代码
public class CacheHelper { private static string fileName = @"D:\huage.txt"; /// <summary> /// 获取Cache /// </summary> /// <param name="key"></param> /// <returns></returns> public static object GetCache(string key) { var objCache = HttpRuntime.Cache; return objCache[key]; } /// <summary> /// 设置当前应用程序指定CacheKey的Cache对象值 /// </summary> /// <param name="key">索引键值</param> /// <param name="obj">缓存对象</param> public static void SetCache(string key, dynamic obj) { var objCache = HttpRuntime.Cache; objCache.Insert(key, obj); } /// <summary> /// 设置当前应用程序指定CacheKey的Cache对象值 /// </summary> /// <param name="key">索引键值</param> /// <param name="obj">缓存对象</param> /// <param name="absoluteExpiration">绝对过期时间 要避免可能的本地时间问题(例如从标准时间改为夏时制),请使用 <see cref="P:System.DateTime.UtcNow" /> 而不是 <see cref="P:System.DateTime.Now" /> 作为此参数值</param> public static void SetCache(string key, dynamic obj, DateTime absoluteExpiration) { var objCache = HttpRuntime.Cache; absoluteExpiration = DateTime.SpecifyKind(absoluteExpiration, DateTimeKind.Utc); //使用absoluteExpiration(绝对过期时间),怎相对过期时间需要为System.Web.Caching.Cache.NoSlidingExpiration objCache.Insert(key, obj, null, absoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration); } /// <summary> /// 设置当前应用程序指定CacheKey的Cache对象值 /// </summary> /// <param name="key">索引键值</param> /// <param name="obj">缓存对象</param> /// <param name="slidingExpiration">最后一次访问所插入对象时与该对象过期时之间的时间间隔</param> public static void SetCache(string key, dynamic obj, TimeSpan slidingExpiration) { var objCache = HttpRuntime.Cache; //使用slidingExpiration(相对过期时间),怎相对过期时间需要为System.Web.Caching.Cache.NoAbsoluteExpiration objCache.Insert(key, obj, null, System.Web.Caching.Cache.NoAbsoluteExpiration, slidingExpiration); } /// <summary> /// 缓存依赖 /// </summary> /// <param name="key">索引键值</param> /// <param name="value">缓存对象</param> public static void SetCacheByCacheDependency(string key, object value) { System.Web.Caching.CacheDependency cacheDependency = new CacheDependency(fileName);//建立缓存依赖项dp HttpRuntime.Cache.Insert(key, value, cacheDependency); } /// <summary> /// 缓存依赖获取值(不存在就取取值) /// </summary> /// <param name="key">索引键值</param> public static object GetCacheByCacheDependency(string key) { if (GetCache(key) == null) { var strRes = new System.IO.StreamReader(fileName).ReadToEnd(); SetCacheByCacheDependency(key, strRes); } return GetCache(key); } /// <summary> ///设置数据库缓存依赖(需要配置服务项) /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <returns></returns> public static void SetCacheBySqlCacheDependency(string key,object value) { var cache = HttpRuntime.Cache; cache.Insert(key, value, new SqlCacheDependency("test", "user")); } /// <summary> /// 获取数据库缓存依赖 /// </summary> /// <param name="key"></param> /// <returns></returns> public static object GetCacheBySqlCacheDependency(string key) { if (GetCache(key) == null) { var value = GetList(); SetCacheBySqlCacheDependency(key, value); } return GetCache(key); } public static List<User> GetList() { using (SqlConnection conn=new SqlConnection("data source=.;initial catalog=test;user id=sa;password=123")) { using (SqlDataAdapter adapter = new SqlDataAdapter("select Id,Name,Age,Password from [user]", conn)) { var ds=new DataSet(); if(conn.State == ConnectionState.Closed) conn.Open(); adapter.Fill(ds, "myds"); var dt = ds.Tables[0]; return DataTableToList<User>(dt); } } } public static List<T> DataTableToList<T>(DataTable dt) { List<T> list = default(List<T>); if (dt != null && dt.Rows.Count > 0) { list = new List<T>(); System.Reflection.PropertyInfo[] propertyInfos = typeof(T).GetProperties(); foreach (DataRow dr in dt.Rows) { T t = Activator.CreateInstance<T>(); foreach (var pro in propertyInfos) { if (pro.CanWrite && dt.Columns.Contains(pro.Name)) pro.SetValue(t, dr[pro.Name], null); } list.Add(t); } } return list; } }
代码通俗易懂,就是将重复使用的东西放入到Cache里面,到期之后程序会自动帮我们清除。但是有时候缓存跟我们要使用的的数据会有差异,这就是缓存跟实际数据不同步造成的结果。这时候Cache里面带了缓存依赖(就是我们的缓存跟他依赖的项目,只要依赖项被修改缓存就会被程序清除)。Cache中有文件、数据库依赖项(其中文件依赖比较简单,数据库依赖代码简单但是需要额外配置服务 这篇文章有介绍数据库配置https://www.cnblogs.com/knowledgesea/p/3904929.html,这篇文章介绍的是配置数据库依赖的细节 https://www.cnblogs.com/zhaojin/archive/2012/03/29/2422986.html)。看上去这些操作可以让我们尽可能的绕过数据库进行客户端的快速响应,但是现在如果应用系统都是很庞大的话。上面所提到的缓存手段,都是在Web服务器本地内存中进行缓存,
现在主流的应用都是分布式系统,这时候这种操作就很鸡肋了。这时候分布式缓存也就应运而生,redis,memcached(http://www.cnblogs.com/zjneter/archive/2007/07/19/822780.html)。总感觉学习的太少啊。。。
本文只是记录学习心得,如果有误请提示博主加以修正。。。
谢谢您那么帅气,还能看完小主的文言文!