将在添加数据库条目时更新缓存内容
本文关键字:更新 缓存 添加 数据库 | 更新日期: 2023-09-27 18:20:22
好吧!到目前为止,我仍在尝试缓存,它非常棒!关于数据库更新的快速问题。
TLDR:数据库更新何时向缓存进行?如果未设置缓存过期时间,是否在用户退出并重新进入应用程序时清除?或者HTTPContext.Current.Cache是一个全局缓存(即,只有当所有用户都退出应用程序时才清除[如果发生这种情况])
假设我有一张桌子:
CREATE TABLE #DaysOfTheWeek(
DayKey INT
,DayDescription VARCHAR(20)
);
INSERT INTO #DaysOfTheWeek VALUES(1, 'Monday');
INSERT INTO #DaysOfTheWeek VALUES(2, 'Tuesday');
INSERT INTO #DaysOfTheWeek VALUES(3, 'Wednesday');
INSERT INTO #DaysOfTheWeek VALUES(4, 'Thursday');
INSERT INTO #DaysOfTheWeek VALUES(5, 'Friday');
我将这些添加到我的ASP.NET web应用程序(.NET 4.5)的下拉列表中。
我知道这是一个非常糟糕的代码。不要复制粘贴这个。它容易出现SQL注入。这应该在存储过程中。我是个坏人
//On page load.
private void PopulateDaysOfWeekDropDownList()
{
var days = new List<ListItem>();
if (HttpContext.Current.Cache["DaysOfTheWeek"] == null)
{
//Go to the database and get all days.
var dt = GetDaysOfTheWeek();
foreach(DataRow row in dt.Rows)
{
var day = new ListItem();
day.Key = row["DayKey"].ToString(); //Key may not be correct, I'm not using a compiler here.
day.Description = row["DayDescription"].ToString();
days.add(day);
}
HttpContext.Current.Cache["DaysOfTheWeek"] = days;
}
else
{
//Retrieve the value from the web cache.
days = (List<ListItem>)HttpContext.Current.Cache["DaysOfTheWeek"];
}
//Bind the results to the web source.
ddlDaysOfWeek.DataSource = days;
ddlDaysOfWeek.DataBind();
}
public DataTable GetDaysOfTheWeek()
{
using (var cnn = new SqlConnection("myConnectionString"))
{
using (var dt = new DataTable())
{
var command = "SELECT DayKey, DayDescription FROM #DaysOfTheWeek WITH(NOLOCK)"
using (var cmd = new SqlCommand(command, cnn) { CommandType = CommandType.Text})
{
using (var adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(dt);
}
return dt;
}
}
}
}
一切都很好。这在我的系统上运行了几天,而网络缓存有五天。
让我们稍后再加上周末:
INSERT INTO #DaysOfTheWeek VALUES(0, 'Sunday');
INSERT INTO #DaysOfTheWeek VALUES(6, 'Saturday');
现在,数据库将包含一周中的所有七天。下一个页面加载事件会占用新的天数吗?或者它会占用缓存的副本,但仍然只显示原始的五个副本?
缓存副本何时(如果有的话)过期并在七天内重新获取?
从系统管理员的角度来看,我们可以做些什么来手动重新刷新服务器缓存吗?
您可以使用SqlCacheDependency。而不是直接将项目分配到缓存,就像您在下面的代码中一样:
HttpContext.Current.Cache["DaysOfTheWeek"] = days;
您希望使用添加了依赖项的Cache.Inter。您还可以聚合依赖关系,以防缓存依赖于多个表。
var cacheItem = days;
var tableName = "someTable";
var databaseName = "someDb";
var cacheKey = "someCacheKey";
var aggDependency = new System.Web.Caching.AggregateCacheDependency();
aggDependency.Add(new System.Web.Caching.SqlCacheDependency(databaseName, tableName));
HttpContext.Current.Cache.Insert(cacheKey, cacheItem, aggDependency);
当缓存依赖项中的表发生更改时,缓存将无效并被删除。