【问题标题】:ASP.NET Caching at data access layer (best practice question)数据访问层的 ASP.NET 缓存(最佳实践问题)
【发布时间】:2010-01-21 10:54:50
【问题描述】:

我目前有一个 LINQ 2 SQL 数据模型和一个支持“乘客”存储库类。存储库如下(在我的脑海中,所以代码可能有错误):

public class PassengerRepository 
{
    public static Passenger GetPassenger(int passengerId)
    {
        Passenger p = null;
        // Linq to sql code to retrieve passenger by passengerId and store in 'p'
        return p;
    }

    public static Passenger GetPassengerByUrl(string passengerUrl)
    {
        Passenger p = null
        // Linq to sql code to retrieve passenger by passengerUrl and store in 'p'
        return p;
    }
}

除此之外,我还有一个 PassengerController 类,如下所示:

public class PassengerController
{

    public static Passenger GetPassenger(int passengerId)
    {
        if (Cache["Passenger_" + passengerId] != null)
            return (Passenger)Cache["Passenger_" + passengerId];

        Passenger p = null;
        p = PassengerRepository.GetPassenger(passengerId);

        Cache["Passenger_" + passengerId] = p;
        return p;
    }

    public static Passenger GetPassenger(string passengerUrl)
    {
        if (Cache["PassengerUrl_" + passengerUrl] != null)
            return (Passenger)Cache["PassengerUrl_" + passengerUrl];

        Passenger p = null;
        p = PassengerRepository.GetPassengerByUrl(passengerUrl);

        Cache["PassengerUrl_" + passengerUrl] = p;
        return p;
    }

}

PassengerId 和PassengerUrl 对于特定乘客来说始终是唯一的。

我的问题是,如果通过 Id 或 Url 获取,我将存储乘客对象的副本,因为缓存键会不同。当我按 Id 获取数据时,我将其存储在缓存中,其中的键取决于PassengerId,因此我无法检查该Passenger 对象是否已为特定Url 存储。这适用于另一种方式,如果通过 Url 获取,如果特定 Id 的乘客对象存在,我无法检查缓存。我的问题是:

  1. 如果通过 Url 或 Id 获取,仅在缓存中存储乘客对象的一个​​实例的最佳方法是什么?我在想也许可以创建一个缓存包装器,然后在通过 Url 获取时,也许一旦我得到了乘客数据,我将按 Id 将乘客存储在缓存中,然后在缓存中为 Url 创建一个新键并存储一个字符串变量带有乘客 ID 对象的键名。 (即在乘客 URL 键中,我将存储对乘客 ID 键的引用)。

  2. 附带说明一下,我将 Controller/Repository 类中的所有数据访问方法都设置为静态的 - 这是否具有高性能和高效的内存?

  3. 我是否将缓存放置在正确的位置?大多数人是把它放在存储库类中还是控制器是一个可以接受的地方?

任何建议将不胜感激!

干杯, A.

【问题讨论】:

    标签: asp.net linq-to-sql caching


    【解决方案1】:

    如果您提供有关您的系统的更多信息,我们可能会更有帮助。例如,您将有多少乘客?你的服务器有多强大等等等等。

    但是根据给定的信息,我可以说:

    1. 您可以在找到Passenger 对象后将它们缓存在一个数组中。 然后,当您要进行另一个搜索时,首先在此数组中搜索。如果您的数组中没有找到乘客,则进入数据库,获取乘客信息,将乘客信息添加到您的数组中并返回找到的乘客信息。

    2. 在我看来,这种方式看起来不错。我们也在一些中型网站中使用它。如果有人提出更好的选择,我也将不胜感激。

    【讨论】:

    • 您好,使用这种数组方法会增加更多开销吗?此外,如果我更新乘客数据,那么我想从缓存中删除陈旧的数据,并且在我看来,使用数组似乎会增加更多的复杂性/开销。乘客人数将在 100,000 人左右。
    • 如果您要为每个用户访问数据库(1. 打开连接,2. 运行一些查询,3. 关闭连接),那么我认为我的方法应该更快。但我在这里假设您不会经常搜索乘客。例如,如果您将乘客缓存半小时,那么您的数组大小不应超过 10000 个元素。你对复杂性的看法是对的。当您更新乘客时,您还应该更新/清理数组中的数据。
    【解决方案2】:

    一段时间后回到这个问题。我开始认为这可能是一个相当主观的问题。对于它的价值,我实际上最终通过从应用程序缓存中的乘客 ID 生成的键存储乘客,例如Passenger_100。然后我在从Passenger URL (Passenger_myurl) 生成的键中创建了一个代理对象,它作为对Passenger_100 键的引用。

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 2017-02-26
      • 2015-09-10
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多