通过两个字段查找数据库实体的高效缓存策略

时间:2018-01-29 11:31:11

标签: c# performance entity-framework caching

我已经实现了一个非常简单的查找缓存,以优化某些数据库实体的处理。缓存类如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SyncEngine.Caches
{
    class TenantsCache : Cache
    {
       System.Collections.Generic.List<tenant> list;

        public override void ReadFromDB()
        {
            using (var ctx = new MyContext())
            {
                this.list = ctx.tenants.ToList<tenant>();
            }
        }

        public override void Add(object o)
        {
            list.Add((tenant)o);
        }

        public tenant LookupByFNandGID(string fn, int groupId)
        {
            tenant match = null;
            foreach (tenant t in list)
            {
                if (t.friendlyName == fn && t.groupId == groupId) // <-- slowest line
                {
                    match = t;
                    break;
                }
            }
            return match;
        }
    }
}

通过分析CPU使用情况,我发现这个Lookup(特别是高亮线)占用了大量的处理时间。

在这里实现此查找/缓存和/或比较是否有更好,更有效的方法?是否有更高效的内置集合,并通过两个字段进行优化查找?

1 个答案:

答案 0 :(得分:3)

您可以使用包含两个字段的自定义键创建词典:

Dictionary<Key, tenant> foo = new Dictionary<Key, tenant>();

然后你可以使用比列表更快的字典:

erb :myerb, locals: {text: "aaaaa", saved: false}