如何在asp.net中缓存一个函数

时间:2010-03-02 13:45:22

标签: asp.net caching function asp.net-3.5

我有一个计算距数据库记录的距离的函数。在一个asp.net页面请求中至少调用此函数两次。在这段时间内,结果不会改变。那么如何缓存结果,我需要在我的应用程序中实现性能。

例如:

public static int GetKilometers(int VehicleID)
{ /*some db query and calculations*/ }

5 个答案:

答案 0 :(得分:2)

如果你只关心一页请求的生命周期结果(如你在问题中提到的那样),那么一个简单的局部变量就足够了:

private int? _dist;

public int GetKilometers(int VehicleID)
{ 
    if (_dist == null) {
        _dist = /*some db query and calculations*/ 
    }
    return _dist;
}

这样可以防止因过度缓存引起的任何内存问题,但仍然可以通过不为同一请求计算两次数据来提高效率。

需要注意的是,您可能不希望这种静态,因为这会将结果缓存到应用程序的多个用户之中。

答案 1 :(得分:1)

要获得快速简便的解决方案,您可以使用HttpContext.Session对象存储如下值:

int distance;
if(Session["distance"] == null)
{
    distance = GetKilometers(vehicleId);
    Session["distance"] = distance;
}
else
{
    distance = Convert.ToInt32(Session["distance"]);
}

为了使它更容易,您可以将其抽象为自己的方法。

修改

上述解决方案适用于最少量的数据。鉴于您的案例中将存储大量数据,我看到两种可能的情况:

车辆X的计算数据对于每个用户来说是不同的
使用UserId(或SessionId),VehicleId和CalculatedData将计算数据缓存在数据库的单独表中。

对于需要车辆X数据的任何用户,车辆X的计算数据相同
将计算数据的数据缓存在数据库中的车辆表中。

无论哪种方式,您对数据库的调用都应检索用户当前请求所需的所有车辆的数据。然后将该数据存储在仅适用于当前请求的局部变量中。如果您要按会话缓存数据,可以使用HttpContext.Session存储SessionId并使用它来从数据库中检索数据。

答案 2 :(得分:1)

从OP的问题来看,所有这些答案都很有用,语法相同,但使用了错误的集合。适当的收集是HttpContext.Current.Items。将此与@Aaron

的答案结合起来

答案 3 :(得分:0)

如果肯定没有改变,则使用if条件保存在会话中

if(Session["functionresult"] == null)
{
    Session["functionresult"] = functionResult;
}

答案 4 :(得分:0)

如果有那么多计算,那么使用Session会占用你的服务器内存。您可以使用ViewState,但这会使您的页面非常重。

有可能不打db吗?或者最小化到db的往返次数。

类似的东西:

public static int GetKilometers(int [] VehicleID) {/ *一次性获取所有数据* /}