我目前正在使用实体框架(),并且有下面的场景需要管理,然而,由于幕后发生的事情很多,我不完全确定最好的路线是什么,而谷歌到目前为止还没有提供必要的答案。
我有大约100个产品在一个产品/供应商风格的数据库。大约有10个表在每个页面上被多次使用--因为小部件等等。
我目前缓存的结果(这100个产品),加上其他核心实体,以执行大约80%的查询,我需要。
但是,有时我需要访问扩展的数据。假设产品特性--它们只出现在产品页面上--因此可以根据需要访问,而不是永久缓存。这里是我的想法大声说,我会感谢任何意见和建议。
- 100 products x 10 features - suddenly becomes 1000. Does this become inefficient very quickly?
感谢您的所有意见和建议。
发布于 2015-03-17 02:17:16
在缓存值时,我总是使用AsNoTracking()将这些值从EF上下文中分离出来。
关于您应该缓存多少信息的问题取决于访问频率和如果信息不存在的话检索信息的成本。我通常使用.NET或Azure提供的缓存方法,因为它们跟踪内存消耗情况,并导致条目在很长一段时间内不被访问时被卸载。msdn上的一个轻微的旧文章很好地解释了ASP.NET缓存机制。
我通常使用抽象类隐藏缓存细节,并使用特定类型的具体实现:
public sealed class CustomerIdCache : AbstractCache<CustomerIdCache, Customer>
{
private CustomerIdCache()
{
}
/// <summary>
///
/// </summary>
/// <returns></returns>
protected override TimeSpan GetExpiration()
{
return new TimeSpan(0, 1, 0, 0);
}
/// <summary>
///
/// </summary>
/// <param name="db"></param>
/// <param name="key"></param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
protected override Customer GetSingleElement(ITimeJackContext db, object[] key)
{
Guid id = (Guid)key[0];
Customer customer = db.Customers.AsNoTracking().SingleOrDefault(x => x.Id == id);
return customer;
}
/// <summary>
///
/// </summary>
/// <param name="entry"></param>
/// <returns></returns>
protected override IEnumerable<object> GetKey(Customer entry)
{
return new object[] { entry.Id };
}
用法:
https://stackoverflow.com/questions/29094687
复制相似问题