Phi 系数用例的键值存储 (Redis)
Key-Value Store (Redis) for Phi Coefficient Use-Case
我想构建一个应用程序,用户可以在其中为一个日期(YYYY-MM-DD 字符串)分配多个标签(字符串)。主要用例是为两个标签(A 和 B)的组合计算 Phi coefficient,这需要将每个日期放入以下类别之一:
- 两个标签都没有分配
- 已分配标签 A,但未分配标签 B
- 标记 B 已分配但未分配标记 A
- 已分配标签 A 和标签 B
关键信息是多少个日期属于每个类别,而不是什么个日期。
问题是,如何持久保存该数据,以便可以针对上述分类快速查找它。
使用键值存储(例如 Redis),将标签作为键存储集合,将每个标签的日期作为值存储是一个选项,可以轻松地用新信息填充存储。对于查找,A 和 B 的交集 (SINTER) 将构成第四类,A 和 B 之间的差异 (SDIFF) 以及 B 和 A 分别构成第二类和第三类。
问题依然存在,如何计算第一类:日期数,Tag A 和 B 都不适用。我想到的唯一选择是通过遍历所有键来读出日期,并从日期总数中减去类别 2、3 和 4 的数量。是否有更优雅、更高效的方式来实现这一目标?还是我最好为该用例使用 SQL 数据库?
编辑:另一个想法是不仅按标签存储日期,而且以冗余方式按日期存储标签,以便更容易检索所有日期。
这里有两种基本方法:以单一规范形式存储数据,并根据需要使用它来计算派生数据;或者预先以多种方式存储信息以优化查找速度。
到目前为止,您已经采用了第一种方法。这很好,因为将信息存储在一个地方可以使很多事情变得更简单,并且消除了数据不一致的风险。缺点是计算派生值可能很慢。在您的情况下,您在最好的情况下谈论 O(n) 操作,在最坏的情况下迭代所有键。尽管在使事情变得更复杂之前进行性能测试总是值得的,但我的直觉是您的担心是对的。
将派生数据与规范数据分开存储可以优化查找性能。你的最后一段建议以多种方式存储相同的信息,但只要你这样做,你还不如存储实际需要的派生值,而不是保留现有的按标签日期的数据结构。
具体来说,我的建议是按日期存储标签,同时单独存储类别 1-4 的计数。每次您记录一个新的(或更改的或删除的)输入值时,您都会更新您的规范数据结构并更新您的计数。您可能可以使用相当简单的 Lua script 以原子方式执行此操作。然后,您可以在 O(1) 时间内访问所需的计数,并确信它们准确地反映了基础数据。
我想构建一个应用程序,用户可以在其中为一个日期(YYYY-MM-DD 字符串)分配多个标签(字符串)。主要用例是为两个标签(A 和 B)的组合计算 Phi coefficient,这需要将每个日期放入以下类别之一:
- 两个标签都没有分配
- 已分配标签 A,但未分配标签 B
- 标记 B 已分配但未分配标记 A
- 已分配标签 A 和标签 B
关键信息是多少个日期属于每个类别,而不是什么个日期。
问题是,如何持久保存该数据,以便可以针对上述分类快速查找它。
使用键值存储(例如 Redis),将标签作为键存储集合,将每个标签的日期作为值存储是一个选项,可以轻松地用新信息填充存储。对于查找,A 和 B 的交集 (SINTER) 将构成第四类,A 和 B 之间的差异 (SDIFF) 以及 B 和 A 分别构成第二类和第三类。
问题依然存在,如何计算第一类:日期数,Tag A 和 B 都不适用。我想到的唯一选择是通过遍历所有键来读出日期,并从日期总数中减去类别 2、3 和 4 的数量。是否有更优雅、更高效的方式来实现这一目标?还是我最好为该用例使用 SQL 数据库?
编辑:另一个想法是不仅按标签存储日期,而且以冗余方式按日期存储标签,以便更容易检索所有日期。
这里有两种基本方法:以单一规范形式存储数据,并根据需要使用它来计算派生数据;或者预先以多种方式存储信息以优化查找速度。
到目前为止,您已经采用了第一种方法。这很好,因为将信息存储在一个地方可以使很多事情变得更简单,并且消除了数据不一致的风险。缺点是计算派生值可能很慢。在您的情况下,您在最好的情况下谈论 O(n) 操作,在最坏的情况下迭代所有键。尽管在使事情变得更复杂之前进行性能测试总是值得的,但我的直觉是您的担心是对的。
将派生数据与规范数据分开存储可以优化查找性能。你的最后一段建议以多种方式存储相同的信息,但只要你这样做,你还不如存储实际需要的派生值,而不是保留现有的按标签日期的数据结构。
具体来说,我的建议是按日期存储标签,同时单独存储类别 1-4 的计数。每次您记录一个新的(或更改的或删除的)输入值时,您都会更新您的规范数据结构并更新您的计数。您可能可以使用相当简单的 Lua script 以原子方式执行此操作。然后,您可以在 O(1) 时间内访问所需的计数,并确信它们准确地反映了基础数据。