【问题标题】:How to provide sort functionality using redis as the secondary indexes如何使用 redis 作为二级索引提供排序功能
【发布时间】:2021-09-22 07:49:15
【问题描述】:

目前我正在做一个项目,我们需要在 redis 之上构建二级索引。因为实际的数据存储将是一个像 S3/Azure Blob 这样的 blob 数据库。

到目前为止,我们能够实现自己的模式管理器,只要数据发生更改,就可以为索引创建/更新/删除。并且索引在Redis中存储为SortedSet

query.Where<Employee>(emp => emp.JoinedOn >= startDate 
               && emp.JoinedOn <= endDate 
               && emp.Salary >= 150000);

我们还使用 C# 表达式实现了查询逻辑。我们在其中构建了一个表达式解析器来遍历表达式 lambda 并运行每个二进制表达式并组合结果。

运行此查询后,我们将获得密钥列表,我们可以从 S3/Azure blob 中获取这些密钥。

问题

现在的问题是,如果我们想要支持排序,我们必须获取整个索引数据并将结果与​​查询后得到的结果相交。

private async Task<string[]> SortResults(QueryModel queryModel, string sortIndex, Stack<List<string>> resultStore)
        {
            var order = queryModel.SortInfo.Direction == SortDirection.Ascending
                ? Order.Ascending
                : Order.Descending;
            var sortedSet = await cacheProvider.SortedSetGetRangeByScoreAsync(sortIndex, 
                double.NegativeInfinity, 
                double.PositiveInfinity, 
                Exclude.None, 
                order);
            var ids = resultStore.Any() ? resultStore.Pop().ToArray() : null;
            return (string[]) sortedSet.Intersect(ids ?? Array.Empty<string>());
        }

有没有一种方法可以避免查询整个索引来支持这一点?

【问题讨论】:

    标签: c# redis stackexchange.redis


    【解决方案1】:

    有没有一种方法可以避免查询整个索引来支持这一点?

    是和不是。

    您无法仅使用普通 Redis 实现此目的。

    但是您可以(并且应该)考虑RediSearch - Redis Secondary Index & Query Engine,它非常适合您的要求及其他要求。这是一个建立在 Redis 之上的模块,由 Redis Labs 自己维护。

    【讨论】:

    • 不幸的是,我们使用的是 AWS 的弹性缓存,它不支持模块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多