假设我有一个包含大量数据的表Tab1
,比方说500000
行(50万行)。现在,我希望每隔半小时从Tab1
到HttpContext.Current.Cache["BookData"]
缓存该数据。现在,我面临的问题是,每当我的c#代码尝试获取该数据时,数据量很大就需要很长时间。因此,我希望我的c#代码显示较旧的缓存数据,除非从数据库中获取新数据,并且在完全获取新数据时,它将删除旧的缓存数据并设置新的缓存数据。
我试过的是,只要数据很小,我就会很好地工作:
[HttpGet]
public IEnumerable<OG_Books> GetBooks()
{
List<OG_Make> BookList = null;
if (HttpContext.Current.Cache["BookData"] != null)
{
DataSet ds = new DataSet();
ds = HttpContext.Current.Cache["BookData"] as DataSet;
BookList = EnumerableExtension.ToList<OG_Books>(ds.Tables[0]);
}
else
{
SqlConnection con = new SqlConnection(ConnectionString);
var command = new SqlCommand("Select_OG_Book", con);
command.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(command);
DataSet ds = new DataSet();
da.Fill(ds);
HttpContext.Current.Cache.Insert("BookData", ds, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0));
BookList = EnumerableExtension.ToList<OG_Books>(ds.Tables[0]);
}
return BookList;
}
上面的代码每半小时缓存一个新数据,这很好用。现在,无论什么时候,这些数据都很庞大,我的代码就会长时间陷入困境:
da.Fill(ds);
所以,我的问题是,如何在从数据库中提取新数据时返回旧的缓存数据,并且在完全提取新数据时,它将删除旧的缓存数据并缓存新数据,如何有可能吗?
答案 0 :(得分:0)
您可以在缓存中使用宽限期。
您可以使用不同TTL的缓存中的2个对象来实现它。
第一个用于“BookData”(您的数据集),例如TTL为1小时(而不是30分钟)。
第二个(可以是对象)是在刷新数据之前控制缓存中BookData的持续时间。例如,您可以使用TTL为30分钟的“BookDataInCache”。
当您插入“BookData”时,您必须同时插入“BookDataInCache”。
当您获得“BookData”时,您必须检查“BookDataInCache”是否仍在缓存中。 如果“BookDataInCache”在缓存中,则可以返回“BookData”, 否则你可以返回“BookData”并发出异步请求来获取并插入带有“BookDataInCache”的新“BookData”。