如何自动更新缓存?

taz01 2010-09-26 05:57:31
之前从没做过缓存,现在要开始做了!

网站要提供产品接口给别人网站用,所以 不可能 每调用一次都去数据库拿数据的吧
而且这样也提高自己网站的访问速度!

过程如下:
一次性把数据库中所有 正在销售 的产品相关信息拿出来放入Cache中
之后:
1、每小时后都会去数据库中查找那些“正在销售”的产品的购买人数,并同步到缓存中

2、每天晚上12点过后,都会自动把缓存中的过期产品删除,并去数据库查找有没有新加入 正在销售 的产品,
有的话把它放入到缓存中!


这样可行吗?

“自动更新” 方法应该不难写,只是如何自动调用这个方法却不知道!




...全文
714 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_ya_ping 2010-09-26
  • 打赏
  • 举报
回复
SqlCacheDependency 这个我想还是可以尝试的,毕竟还不太要自己写代码,用Cahce的话,也是可以实现的,如果缓存过了期,那么要用的的时候可以判断一下,没有就再新建一个缓存。
porschev 2010-09-26
  • 打赏
  • 举报
回复
设置缓存过期时间。。

系统会自动清理
hchxxzx 2010-09-26
  • 打赏
  • 举报
回复
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;
}
}
}
viena 2010-09-26
  • 打赏
  • 举报
回复
cache都是试图读取的,读不到,再到数据库中取同时写cache
而看你这需求,是要全部“正在销售”的数据,这与cache不是一个概念
你可以弄一个集合类型的静态变量~
viena 2010-09-26
  • 打赏
  • 举报
回复
你这好象不叫缓存,缓存系统会自动清理的
fangyuantdy 2010-09-26
  • 打赏
  • 举报
回复
网站启动的时候开一个定时器,到时间就调用更新方法
wuyq11 2010-09-26
  • 打赏
  • 举报
回复
cache缓存,timer定时操作
缓存依赖SqlCacheDependency

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧