>我正在使用 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;
首先,这根本不是真的。Aerospike 读取总是比写入更快。要执行写入,需要更长的代码路径和更多的 IO。除非您声明您的操作是REPLACE
否则它将表现为更新插入,这意味着它将首先尝试读取相同的记录,合并您的数据,然后将其写出。
你上面所做的不是比较苹果和苹果。写(put
(是单个记录操作。您应该将写入与单个记录读取进行比较 (get
(。您正在执行的是扫描(如果还附加了二级索引筛选器,则为查询(,这是一个多节点操作。即使它只返回一条记录,它也必须转到所有节点,并且在每次遍历中,整个主索引都与您的谓词筛选器匹配。
有几种方法可以解决这个问题。首先,您可以根据epochDay
值构建二级索引,而不是谓词筛选器,而是使用具有 BETWEEN 范围谓词的二级索引筛选器。谓词筛选器会更小,只有字符串谓词。
其次,您可以使用建模方法,将数据合并到单个较大的记录中作为列表或映射,并使用列表或映射 API 获取该复杂数据类型中所需的元素范围。查看 Aerospike 开发者博客和 Aerospike 代码示例。