使用C#中的缓存管理大数据

时间:2018-04-02 12:29:08

标签: performance caching asp.net-web-api

假设我有一个包含大量数据的表Tab1,比方说500000行(50万行)。现在,我希望每隔半小时从Tab1HttpContext.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);

所以,我的问题是,如何在从数据库中提取新数据时返回旧的缓存数据,并且在完全提取新数据时,它将删除旧的缓存数据并缓存新数据,如何有可能吗?

1 个答案:

答案 0 :(得分:0)

您可以在缓存中使用宽限期。

您可以使用不同TTL的缓存中的2个对象来实现它。

第一个用于“BookData”(您的数据集),例如TTL为1小时(而不是30分钟)。

第二个(可以是对象)是在刷新数据之前控制缓存中BookData的持续时间。例如,您可以使用TTL为30分钟的“BookDataInCache”。

当您插入“BookData”时,您必须同时插入“BookDataInCache”。

当您获得“BookData”时,您必须检查“BookDataInCache”是否仍在缓存中。 如果“BookDataInCache”在缓存中,则可以返回“BookData”, 否则你可以返回“BookData”并发出异步请求来获取并插入带有“BookDataInCache”的新“BookData”。