【问题标题】:What is the most optimal method of querying a reliable dictionary collection查询可靠字典集合的最佳方法是什么
【发布时间】:2016-01-15 10:09:07
【问题描述】:

我想使用服务结构可靠字典来存储我们打算通过休息接口查询的数据。我想知道查询这些集合中保存的数据的最佳方法是什么。

除了简单地枚举集合之外,文档似乎没有提供任何方法来支持查询IReliableDictionary 接口。

是从可靠字典中取出每个对象并弹出到 List 集合中进行查询的唯一选择吗?

谢谢

【问题讨论】:

    标签: azure-service-fabric


    【解决方案1】:

    正如 Vaclav 在他的回答中提到的那样,您始终可以枚举整个字典并根据需要进行过滤。此外,请查看IReliableDictionary 的文档,特别是CreateEnumerableAsync(ITransaction, Func<TKey, Boolean>, EnumerationMode)。这允许您预先过滤希望包含在枚举中的键,这可能会提高性能(例如,通过避免将不必要的值从磁盘分页)。

    简单示例(异常处理/重试/等为简洁省略):

    var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<int, string>>(new Uri("fabric:/myDictionary"));
    
    using (var tx = this.StateManager.CreateTransaction())
    {
        // Fetch all key-value pairs where the key an integer less than 10
        var enumerable = await myDictionary.CreateEnumerableAsync(tx, key => key < 10, EnumerationMode.Ordered); 
        var asyncEnumerator = enumerable.GetAsyncEnumerator();
    
        while (await asyncEnumerator.MoveNextAsync(cancellationToken))
        {
            // Process asyncEnumerator.Current.Key and asyncEnumerator.Current.Value as you wish
        }
    }
    

    您可以创建与您的 REST 查询相对应的罐装或动态键过滤器,这些查询基于键进行搜索 - 对于基于值的查询,您需要回退到完全枚举(例如,使用与上述相同的模式,但省略键过滤器)或使用通知来构建您自己的二级索引。

    【讨论】:

    • 添加一些代码会很有帮助。只是有一个链接和类名并不是很有用。
    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • GetAsyncEnumerator 是否获取当时返回的每个键/值,是否在您通过枚举 MoveNextAsync() 时获取它们?我试图从我的字典中获取第一个键,想知道是否这样做然后只调用一次 MoveNextAsync() 会导致仅第一个键/值对被拉出还是整个集合都被拉出?
    【解决方案2】:

    IReliableDictionary 实现了 IEnumerable,这意味着您可以使用 LINQ 表达式查询它,就像使用 IDictionary 一样。

    请注意,对 IReliableDictionary 的枚举使用快照隔离,因此它是无锁的。基本上,这意味着当您开始枚举时,您正在枚举字典,就像您开始时一样。如果在您枚举时添加或删除项目,这些更改将不会出现在该枚举中。有关此内容和 Reliable Collections 的更多信息,请点击此处:https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-reliable-collections/

    【讨论】:

    • IEnumerable 支持已被删除查看其他问题并使用 IAsyncEnumerable
    【解决方案3】:

    看这里What would be the best way to search an IReliableDictionary?

    有两种方法可以做到这一点

    1. Eli Arbel has async extension methods on Gist 提供一个 桥接到 Ix-Async 以及 Select 的异步实现, SelectMany 和 Where。
    2. 您可以 wrap IAsyncEnumerable in a regular IEnumerable 简单地包装异步

    【讨论】:

      【解决方案4】:

      这个答案:Convert IReliableDictionary to IList 展示了如何将 SerivceFabric 的 IAsyncEnumerable 转换为通用的 IAsyncEnumerable。然后就可以使用dotnet提供的Async Linq了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 2011-05-09
        • 2018-10-30
        • 2010-10-12
        • 2015-05-10
        • 1970-01-01
        相关资源
        最近更新 更多