java - 在 aerospike 中第一次在 bin 中插入数据,然后是增量
问题描述
我将一些计数器存储在 aerospike-say 计数器a
中,b
并c
连同一个 parent_id 说pid
,显然还有一个 pk 说pk
。我需要从我的服务中增加计数器,所以我写了三个函数incrementA
,incrementB
和incrementC
。
现在假设,我必须从服务中调用函数incrementA
。计数器a
递增,但其他计数器均未初始化为0
. 现在,我知道当我调用incrementB
或incrementC
相应的计数器会增加时,但我找不到初始化pid
.
我可以想到以下方法来解决上述问题:
- 在我的服务中编写初始化逻辑。所以,在 aerospike 我有类似的东西
{'pk':'pk1', 'a':0,'b':0,'c':0,'pid':'pid1'}
。 - 每当我对任何计数器进行增量时,我也会对其他计数器进行初始化,或者
pid
如果尚未完成。
上述方式的问题是:
- 要从服务初始化,我必须检查初始化是否已经完成(否则我将重置我的计数器)。这基本上会使 aerospike 呼叫的数量增加一倍。(批处理调用在这里有帮助吗?)
- 如果在增加特定计数器的同时为其他人初始化,我将
pid
使用相同的值一次又一次地更新。
如果有人能提出更好的方法,我将不胜感激!
PS:我需要pid
在数据库中为每个pk
,因为我需要查询所有pk
具有相同pid
.
解决方案
您可以调用 incrementX(A、B 或 C)来增加 X 而无需初始化其他人,并且如果特定计数器的 bin 不存在,则在读取计数器的应用程序一侧将其视为其计数器为 0。
关于 pid,我会考虑在另一个流程中添加它(或用它创建记录)——一旦你知道 pk/父关系(即使它是在创建 pk 时)添加/更新记录(仅限 pk 和 pid)——不是每个增量请求。
WritePolicy 的 RecordExistsAction 字段的默认值(Aerospike 中每个写入方法的一部分)是 UPDATE 意思是如果不存在则创建或如果存在则更新,所以不管哪个先运行 - 增量或 pk - parent_id 关系。
另一种解决方案(有点矫枉过正)可能是添加一个单例服务,其中包含 pk id 的 Map<Integer, Boolean> 和初始化指示。
- 每次应用程序启动时,都会根据您在数据库中已有的记录来填充地图。
当发生增量时:
- 如果 pk 已初始化 -> 增加相关计数器。
- 如果不是 -> 按照您的建议初始化 pk
{'pk':'pk1', 'a':0,'b':0,'c':0,'pid':'pid1'}
并将 pk 添加到单例映射以将其标记为已初始化。
推荐阅读
- r - 使用 R 交叉匹配相同/精确值的列
- java - 反转链接列表未按预期工作
- python - 我可以将 GridSearchCV 与 KNeighboursRegressor 一起使用吗?
- prolog - 如何在 Prolog 中从 Haskell 编写 init 函数
- mongodb - MongoDB - 从集合中获取最多 3 个值
- nginx - 带有 https 上游的 Nginx OSM 切片缓存代理
- python - 使用 Tkinter 窗口运行另一个显示相机预览的 python 文件
- tensorflow - TensorFlow 属性“贡献”
- rust - 强制实现特征组合的特定结构
- sql - 请帮助 - ORA-00917: 缺少逗号插入错误