【发布时间】: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