servicestack,C#,.net,Redis,servicestack" /> servicestack,C#,.net,Redis,servicestack" />

C# servicestack.redis GetAll().where()和GetByIds()之间的速度是否不同

C# servicestack.redis GetAll().where()和GetByIds()之间的速度是否不同,c#,.net,redis,servicestack,C#,.net,Redis,servicestack,我最近在使用servicestack.redis,我需要从IRedisTypedClient进行查询。我知道所有的数据都在内存中,但我还是想知道,GetAll.Where和GetByIds之间的速度有差异吗 GetAll和GetById是servicestack.redis提供的两种方法 Use GetAll可以通过lambda继续在resultby中搜索,这意味着我可以使用一些自定义条件,但我不知道这是否会从redis内存加载所有数据,然后在IEnumable中搜索,以及搜索速度是否会比Get

我最近在使用servicestack.redis,我需要从IRedisTypedClient进行查询。我知道所有的数据都在内存中,但我还是想知道,GetAll.Where和GetByIds之间的速度有差异吗

GetAll和GetById是servicestack.redis提供的两种方法


Use GetAll可以通过lambda继续在resultby中搜索,这意味着我可以使用一些自定义条件,但我不知道这是否会从redis内存加载所有数据,然后在IEnumable中搜索,以及搜索速度是否会比GetById慢。

我刚刚做了一个实验,我存储了100万个objectps:有一个servicestack的bug,一次只能存储大约50万个对象

使用这两种方法进行查询

DateTime beginDate = DateTime.Now;
Debug.WriteLine("查询1开始");`  
Website site = WebsiteRedis.GetByCondition(w => w.Name == "网址2336677").First();
double time = (DateTime.Now - beginDate).TotalMilliseconds;
Debug.WriteLine("耗时:" + time + "ms");

DateTime beginDate2 = DateTime.Now;
Debug.WriteLine("查询2开始");
Website site2 = WebsiteRedis.GetByID(new Guid("29284415-5de0-4781-bea4-5e01332814b2"));
double time2 = (DateTime.Now - beginDate2).TotalMilliseconds;
Debug.WriteLine("耗时:" + time2 + "ms");
结果是 GetAll.Where-需要19秒, GetById-以190ms为单位


我猜这是因为servicestack使用对象id作为redis键,所以永远不要使用GetAll。作为查询,每个对象都应该与id相关,并使用GetById作为查询。GetAll应该在记录较少的对象上使用。

我刚刚做了一个实验,我存储了100万个objectps:有一个servicestack的bug,一次只能存储大约50万个对象

使用这两种方法进行查询

DateTime beginDate = DateTime.Now;
Debug.WriteLine("查询1开始");`  
Website site = WebsiteRedis.GetByCondition(w => w.Name == "网址2336677").First();
double time = (DateTime.Now - beginDate).TotalMilliseconds;
Debug.WriteLine("耗时:" + time + "ms");

DateTime beginDate2 = DateTime.Now;
Debug.WriteLine("查询2开始");
Website site2 = WebsiteRedis.GetByID(new Guid("29284415-5de0-4781-bea4-5e01332814b2"));
double time2 = (DateTime.Now - beginDate2).TotalMilliseconds;
Debug.WriteLine("耗时:" + time2 + "ms");
结果是 GetAll.Where-需要19秒, GetById-以190ms为单位


我猜这是因为servicestack使用对象id作为redis键,所以永远不要使用GetAll。作为查询,每个对象都应该与id相关,并使用GetById作为查询。GetAll应该在记录较少的对象上使用。

您可以查看的实现,看看它们是如何工作的

GetByIds只是将所有ID转换为一个完全限定键,每个条目都存储在该键下,然后调用创建一个MGET请求来获取所有值:

public IList<T> GetByIds(IEnumerable ids)
{
    if (ids != null)
    {
        var urnKeys = ids.Map(x => client.UrnKey<T>(x));
        if (urnKeys.Count != 0)
            return GetValues(urnKeys);
    }

    return new List<T>();
}

public IList<T> GetAll()
{
    var allKeys = client.GetAllItemsFromSet(this.TypeIdsSetKey);
    return this.GetByIds(allKeys.ToArray());
}
GetAll从TypeIdsSetKey获取所有ID,即包含该类型所有ID的Redis集,然后调用GetByID

所以GetByIds速度更快,因为它对Redis的调用更少,但它们加在一起只执行2个Redis操作


请注意,它们都返回内存中的.NET列表,因此您可以使用LINQ进一步过滤返回的结果,但它会返回该类型的所有结果,并且过滤是在客户机上执行的,因此这对于大型数据集是无效的。相反,您应该查看常见查询。

您可以查看的实现以了解它们是如何工作的

GetByIds只是将所有ID转换为一个完全限定键,每个条目都存储在该键下,然后调用创建一个MGET请求来获取所有值:

public IList<T> GetByIds(IEnumerable ids)
{
    if (ids != null)
    {
        var urnKeys = ids.Map(x => client.UrnKey<T>(x));
        if (urnKeys.Count != 0)
            return GetValues(urnKeys);
    }

    return new List<T>();
}

public IList<T> GetAll()
{
    var allKeys = client.GetAllItemsFromSet(this.TypeIdsSetKey);
    return this.GetByIds(allKeys.ToArray());
}
GetAll从TypeIdsSetKey获取所有ID,即包含该类型所有ID的Redis集,然后调用GetByID

所以GetByIds速度更快,因为它对Redis的调用更少,但它们加在一起只执行2个Redis操作


请注意,它们都返回内存中的.NET列表,因此您可以使用LINQ进一步过滤返回的结果,但它会返回该类型的所有结果,并且过滤是在客户机上执行的,因此这对于大型数据集是无效的。相反,你应该看看常见的问题。

最好的答案是试试看,然后发现…@BugFinder你是对的,我今晚会试试看,当我发现后告诉你的人。最好的答案是试试看,然后发现…@BugFinder你是对的,我今晚会试试看,当我发现后告诉你的人。请不要使用代码的屏幕截图。粘贴代码inI现在编辑它,仍然有一些标记代码的问题,但可以看到。请不要使用代码的屏幕截图。粘贴代码我现在编辑它,仍然有一些问题与降价代码,但可以看到。真棒,我只是阅读你在答案中链接的问题,并检查你的个人资料,你回答我在同一时间。真棒,我只是阅读你在答案中链接的问题,并检查你的个人资料,你回答我在同一时间。