首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在asp.net中缓存函数

如何在asp.net中缓存函数
EN

Stack Overflow用户
提问于 2010-03-02 21:45:22
回答 5查看 509关注 0票数 1

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

例如:

代码语言:javascript
复制
public static int GetKilometers(int VehicleID)
{ /*some db query and calculations*/ }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-02 21:55:20

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

代码语言:javascript
复制
private int? _dist;

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

这将防止过度缓存引起的任何内存问题,但由于不会为同一请求计算两次数据,因此仍具有一定的效率。

需要注意的一点是,您可能不希望使用这种静态方法,因为这样会在应用程序的多个用户之间缓存结果。

票数 2
EN

Stack Overflow用户

发布于 2010-03-02 21:48:05

为了快速方便地解决问题,您可以使用HttpContext.Session对象来存储如下所示的值:

代码语言:javascript
复制
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的计算数据都是相同的

将计算数据缓存在数据库的vehicle表的列中。

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

票数 1
EN

Stack Overflow用户

发布于 2010-03-02 22:06:38

从OP的问题来看,所有这些答案都是有用的,语法是相同的,但使用了错误的集合。合适的集合是HttpContext.Current.Items。把这个和@Aaron的答案结合起来

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2363470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档