之前从没做过缓存,现在要开始做了!网站要提供产品接口给别人网站用,所以 不可能 每调用一次都去数据库拿数据的吧
而且这样也提高自己网站的访问速度!过程如下:
一次性把数据库中所有 正在销售 的产品相关信息拿出来放入Cache中
之后:
1、每小时后都会去数据库中查找那些“正在销售”的产品的购买人数,并同步到缓存中2、每天晚上12点过后,都会自动把缓存中的过期产品删除,并去数据库查找有没有新加入 正在销售 的产品,
有的话把它放入到缓存中!
这样可行吗?“自动更新” 方法应该不难写,只是如何自动调用这个方法却不知道!

解决方案 »

  1.   

    cache缓存,timer定时操作
    缓存依赖SqlCacheDependency
      

  2.   

    cache都是试图读取的,读不到,再到数据库中取同时写cache
    而看你这需求,是要全部“正在销售”的数据,这与cache不是一个概念
    你可以弄一个集合类型的静态变量~
      

  3.   

    1.缓存会自动清除,这个清除的时间,取决于在创建缓存时你所设定的过期时间.
    2.这里面涉及到一个问题,当数据库添加了新记录的时候,你的新记录能否及时反馈到缓存中?
    以下,是根据你这个要求,写的一个缓存应用示例代码,请自行参考.using System;
    using System.Web;
    using System.Web.Caching;
    using System.Data;
    using System.Collections.Generic;namespace Test
    {
        /// <summary>
        /// 缓存应用演示
        /// </summary>
        public class CacheData
        {
            /// <summary>
            /// 缓存名称
            /// 不同的缓存,名称不能相同,因为缓存是全局性的
            /// </summary>
            public string CacheName = "CacheData";        /// <summary>
            /// 页面Cache对象
            /// </summary>
            private System.Web.Caching.Cache _TheCache = null;
            /// <summary>
            /// 页面Cache对象
            /// </summary>
            protected System.Web.Caching.Cache TheCache
            {
                get
                {
                    //值必须使用HttpRuntime
                    //由于System.Web.Caching.Cache是依赖于web页面存在的
                    //但缓存通常都不一定是由web页面请求
                    //使用httpruntime就可以避免这个问题.
                    this._TheCache = HttpRuntime.Cache;
                    return (this._TheCache);
                }
            }        /// <summary>
            /// 缓存时间,单位为小时,默认为1小时
            /// 当然,这里只是一个数值而已,关键看后面的使用
            /// </summary>
            private int _CacheTime = 1;
            /// <summary>
            /// 缓存时间,单位为小时,默认为10分钟
            /// </summary>
            protected int CacheTime
            {
                get { return (this._CacheTime); }
                set { this._CacheTime = value; }
            }
            /// <summary>
            /// 缓存对象
            /// 此处使用Dictionary存储值,也可以修改为IList等
            /// </summary>
            private static Dictionary<string,string> _Data = null;
            /// <summary>
            /// 缓存
            /// </summary>
            public static Dictionary<string,string> Data
            {
                get
                {
                    CacheData cache = new CacheData();                //每次向缓存请求数据的时候,都会判断有没有的指定的缓存
                    //如果发现没有,那么就会调用WriteCache()方法求取数据,当然,这个方法是自己写的
                    if (cache.TheCache.Get(cache.CacheName) == null)
                    {
                        //如果缓存中没有指定名称的缓存,则向数据库请求数据
                        cache.WriteCache();
                    }                //从缓存中将数据转换出来
                    _Data = (Dictionary<string, string>)cache.TheCache[cache.CacheName];                return (_Data);
                }
            }
            /// <summary>
            /// 写入缓存
            /// </summary>
            private void WriteCache()
            {
                //此处,即可以向数据库请求数据
                //本处仅为演示,仅NEW了一个对象,勿误
                Dictionary<string, string> value = new Dictionary<string, string>();            //设定缓存过期时间,有2种:绝对过期/移动过期
                //本处使用绝对过期,意思就是从现在起,1小时后这个数据就不用了,需要重新向数据库请求
                //什么时候请求呢?在数据被清除之后,第一个访问此缓存的时候,将自动再向数据库请求数据
                DateTime timeTime = DateTime.Now.AddHours(this.CacheTime);            //缓存依赖
                //事实上,如果设定此依赖,则缓存会有一个进程监控被指定的文件,如果该文件的最后修改时间产生变化,则缓存即会清除当前缓存数据
                //也可以依赖于数据库,但目前只能依赖sqlServer数据库
                CacheDependency dep = new CacheDependency("c:\\test.txt");            //使用绝对过期方式
                //OnCacheItemUpdateCall:如果你确信你的原来的数据还需要再次利用,可以使用缓存移除通知,在该方法中,可以进一步处理原来的缓存值
                //TheCache.Insert(CacheName, value, null, timeTime, System.Web.Caching.Cache.NoSlidingExpiration, OnCacheItemUpdateCall);
                TheCache.Insert(CacheName, value, dep, timeTime, System.Web.Caching.Cache.NoSlidingExpiration);
            }        /// <summary>
            /// 用于在从缓存中移除缓存项之前通知应用程序。
            /// </summary>
            /// <param name="key">要从缓存中移除的项的标识符,实际为缓存名称</param>
            /// <param name="reason">要从缓存中移除项的原因。</param>
            /// <param name="expensiveObject">此方法返回时,包含含有更新的缓存项对象。</param>
            /// <param name="dependency">此方法返回时,包含定义项对象和文件、缓存键、文件或缓存键的数组或另一个 System.Web.Caching.CacheDependency 对象之间的依赖项的对象。</param>
            /// <param name="absoluteExpiration">此方法返回时,包含对象的到期时间。</param>
            /// <param name="slidingExpiration">此方法返回时,包含对象的上次访问时间和对象的到期时间之间的时间间隔。</param>
            public void OnCacheItemUpdateCall(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
            {
                try
                {
                    //执行所需要执行的事务(比如发送邮件)
                    //在执行过程中必须排除错误,否则错误之后,定时器就停止了
                }
                catch
                {
                    //可进行错误处理,但要保证此错误处理本身无错
                }
                //这里,给expensiveObject对象赋值,如果赋原来的值,比如expensiveObject=Data,那么原来的缓存值将被重新利用
                //在这个事件中,当前的缓存还没有清除,还可以访问;但此事件之后,就真正清除数据了.
                //当然,可以在这里,再向数据库请求数据赋值给expensiveObject
                expensiveObject = null;
                //缓存依赖,此处不设置
                dependency = null;
                //重新定义下一次过期时间
                //重新设定下一次缓存的过期时间,这里,如果上面有执行一些其他处理的话,将会导致下一次缓存过期时间有一定的延迟
                //如果需要在精确的时间里面使用过期事件,你可以在这里对下一次过期时间进行计算与处理
                absoluteExpiration = System.DateTime.Now.AddHours(this.CacheTime);
                slidingExpiration = System.Web.Caching.Cache.NoSlidingExpiration;
            }        /// <summary>
            /// 呼叫定时器
            /// </summary>
            public static void CallTime()
            {
                //用于初始呼叫,没什么作用
                //但可以利用此方法,在application.start事件中调用,就可以实现网站一建立起来,缓存同步建立
                //不需要等有人访问的时候才建立缓存数据
                int count = Data.Count;
            }        /// <summary>
            /// 根据ID获取数据
            /// </summary>
            /// <param name="keyId"></param>
            /// <returns></returns>
            public static string GetDataInfo(string keyId)
            { 
                //为保证新添加数据无法立即反映到缓存中的问题
                //此处可以采取先找缓存求取数据,如果没有则向数据库求取数据,取到之后,同步写入缓存并返回数据
                string returnValue = string.Empty;            if (Data.TryGetValue(keyId, out returnValue) == false)
                {
                    //从数据库中根据ID获取值,如果取不到,则向数据库请求
                    returnValue = "";//向数据库请求数据:returnValue = getxxx();                if (string.IsNullOrEmpty(returnValue) == false)
                    { 
                        //取到数据了,写到缓存中
                        //这样,下次再取的时候就有数据了,很大程度上解决了缓存更新缓慢的问题.
                        Data.Add(keyId, returnValue);
                    }
                }            return returnValue;
            }
        }
    }
      

  4.   

    SqlCacheDependency 这个我想还是可以尝试的,毕竟还不太要自己写代码,用Cahce的话,也是可以实现的,如果缓存过了期,那么要用的的时候可以判断一下,没有就再新建一个缓存。