我正在使用aerospike v4.8,并且正在向aerospike发出读取和写入请求,其中在我的写入请求中我获得4000个写入/秒的吞吐量,而在读取中该吞吐量仅为10-15个读取/秒,即非常低。
我的查询是:
let query = aerospikeClient.query(nameSpace, set)
query.select('count', 'targetKey')
query.predexp = [
predexp.stringBin('campaignKey'),
predexp.stringValue(Id1 + ':' + Id2 + ':' + Id3 + ':' + channel),
predexp.stringEqual(),
predexp.integerBin('epochDay'),
predexp.integerValue(epochDay),
predexp.integerGreaterEq(),
predexp.integerBin('epochDay'),
predexp.integerValue(epochDay),
predexp.integerLessEq(),
predexp.and(3)
]
无法理解这里出了什么问题,需要帮助。
我的配置是:
namespace test {
replication-factor 2
memory-size 8G
default-ttl 7d
storage-engine device {
device /dev/xvdf
scheduler-mode noop
write-block-size 16K
data-in-memory false
}
}
索引是:
CREATE INDEX campaignIndex ON antiSpamming.userTargetingMatrix (campaignKey) string;
CREATE INDEX targetIndex ON antiSpamming.userTargetingMatrix (targetKey) string;
CREATE INDEX epochDayIndex ON antiSpamming.userTargetingMatrix (epochDay) NUMERIC;
答案 0 :(得分:3)
第一件事,那根本不是真的。 Aerospike读取总是比写入快。要执行写操作,需要更长的代码路径和更多的IO。除非您声明您的操作是REPLACE
,否则它将表现为upsert,这意味着它将首先尝试读取同一条记录,合并数据,然后将其写出。
您在上面所做的不是将苹果与苹果进行比较。写(put
)是单个记录操作。您应该将写入与单个记录读取(get
)进行比较。您正在做的是扫描(如果您还附加了辅助索引过滤器,它将是查询),这是一个多节点操作。即使只返回一条记录,它也必须转到所有节点,并且在每次遍历中都需要整个主索引来匹配您的谓词过滤器。
有几种解决方法。例如,您可以在epochDay
值上构建二级索引,并且可以使用带有BETWEEN range predicate的二级索引过滤器来代替谓词过滤器。谓词过滤器会更小,只是字符串谓词。
第二,您可以使用一种建模方法,其中将数据以list或map的形式合并到一个较大的记录中,并使用list或map API获取元素的范围想要那种复杂的数据类型。看看Aerospike developer blog和Aerospike code examples。