【发布时间】:2019-12-08 15:54:54
【问题描述】:
目标是设计一个队列,其中包含一些值,例如 A。但只有当传入值 D 与 B & C 不匹配时,我才必须从队列中选择一个值。
A、B、C之间的关系可以看成表格数据。
+------------------+------------------+------------------+
| A | B | C |
+------------------+------------------+------------------+
| 12312 | 123123 | 2323 |
| <some int value> | <some int value> | <some int value> |
+------------------+------------------+------------------+
我有一个传入值 D。
现在我必须简单地从 D 的值不等于 B 或 C 的行中选择值 A。
请注意,A、B、C 都不是事先知道的。这些将由 db 或 redis 中的单独进程填充。我知道的唯一值是 D,我必须在第一行找到 A 的值,我发现 B 和 C 的值与 D 不匹配。
如果我在关系数据库上执行此操作非常简单,即示例查询将是
Select A from table where B != D and C != D LIMIT 1
但我不确定如何使用 redis 之类的键值存储来做到这一点?
试试 1
最基本的想法是在redis中按照以下格式维护一个列表
somekey: ['a1:b1:c1', 'a2:b2:c2', 'a3:b3:c3', ...]
然后我可以简单地运行lrange somekey 0 -1,然后遍历每个元素,在: 上拆分,直到找到b 和c 都不等于D 的元素。
但是这种方法非常昂贵,因为我必须为每个 D 值遍历整个列表。
试试 2
另一种方法我尝试创建以下格式的 redis 键
+------------------+-----------------------------+
| Key | Value |
+------------------+-----------------------------+
| prefix_<B1>_<C1> | [<A11>, <A12>, <A13>, ....] |
| prefix_<B2>_<C2> | [<A21>, <A22>, <A23>, ....] |
+------------------+-----------------------------+
这种方法的问题是redis不支持搜索键not matching a pattern。
所以我必须先获取所有密钥,然后在应用程序级别进行正则表达式搜索。
然后,一旦我找到一个键,我就会从该键的列表中弹出第一个值。
我的首选方法是使用 redis,但也欢迎使用其他解决方案。
【问题讨论】:
-
您可能需要考虑一种基于 RediSearch 的更有效方式
标签: database search data-structures redis