我们希望使用Aerospike作为事件ID重复数据删除的缓存,并使用预定义的TTL。
我们的用例非常简单:对于我们收到的每个事件,我们都想检查缓存中是否存在此事件ID。如果是这样,我们会想要重置TTL(触摸记录)并在我们的应用程序中将此事件标记为欺诈,否则我们希望执行put操作来插入此ID。
我们计划做的事情如下:
(i)配置单个记录命名空间,因为我们希望存储的唯一内容是id。我们将使用事件ID作为键,并将NullValue存储为相应的值。 (因为除了关键值之外我们真的不需要任何东西)。
(ii)对于重复数据删除检查,我们将首先检查client.exists(),然后在写策略中使用RecordExistsAction.REPLACE执行put操作(因为这是针对性能优化的)。这两个操作都将在execute()块中调用,以实现原子性。
但我们对以下内容有一些疑问:
(i)关于操作块,我们希望做的这种检查和设置事务似乎是一个非常常见的用例。是否有以更清洁的方式实现此目的的API? (我们找不到任何东西)
(ii)是否绝对有必要拥有一个垃圾桶?我们只希望存储密钥而没有相应的值。我意识到关键值没有被存储过,而Aerospike只存储摘要,但由于exists()是我们唯一关心的事情,有没有办法摆脱额外的bin存储开销?
谢谢!
答案 0 :(得分:3)
(ii)是否绝对有必要拥有一个垃圾桶?我们只希望存储密钥而没有相应的值。我意识到密钥值永远不会存储,Aerospike只存储摘要,但由于exists()是我们唯一关心的问题,有没有办法摆脱额外的bin存储开销?
您正在寻找data-in-index。您必须有一个值,没有值将删除记录。对于索引中的数据,该值需要为8个字节或更少(通常使用整数)。
由于需要使用单个bin来使用索引中的数据,因此消除了大部分的bin开销。