之前从没做过缓存,现在要开始做了!网站要提供产品接口给别人网站用,所以 不可能 每调用一次都去数据库拿数据的吧
而且这样也提高自己网站的访问速度!过程如下:
一次性把数据库中所有 正在销售 的产品相关信息拿出来放入Cache中
之后:
1、每小时后都会去数据库中查找那些“正在销售”的产品的购买人数,并同步到缓存中2、每天晚上12点过后,都会自动把缓存中的过期产品删除,并去数据库查找有没有新加入 正在销售 的产品,
有的话把它放入到缓存中!
这样可行吗?“自动更新” 方法应该不难写,只是如何自动调用这个方法却不知道!
而且这样也提高自己网站的访问速度!过程如下:
一次性把数据库中所有 正在销售 的产品相关信息拿出来放入Cache中
之后:
1、每小时后都会去数据库中查找那些“正在销售”的产品的购买人数,并同步到缓存中2、每天晚上12点过后,都会自动把缓存中的过期产品删除,并去数据库查找有没有新加入 正在销售 的产品,
有的话把它放入到缓存中!
这样可行吗?“自动更新” 方法应该不难写,只是如何自动调用这个方法却不知道!
解决方案 »
- sc.ExecuteNonQuery();出错 请问怎么回事??
- asp.net web开发 错误
- 关于<bgsound>的问题
- 如何获取ListView中DataPager的子控件的ClientID
- 工作流的問題,100分求思路與建議,請大家進來看看,謝謝!
- (菜鸟问题)请问Page.Cache和Response.Cache这两个有什么区别????
- 网站发布到空间报错
- 我新建了一个类,但是我在里面写这个代码的时候提示没有引用
- 如何把几个表的内容同时放入dataset里面,谢了!
- 为什么这样无法正确判断DataReader是否包含某一列?
- 如何使GridView1 的脚注里的字不换行?
- 如何控制用户的下载文件权限
缓存依赖SqlCacheDependency
而看你这需求,是要全部“正在销售”的数据,这与cache不是一个概念
你可以弄一个集合类型的静态变量~
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;
}
}
}