是否可以在 Aerospike 中搜索以某个前缀开头的所有键?
Is it possible to search for all keys that start with a certain prefix in Aerospike?
所以我希望将我们现有的 redis 数据建模到 aerospike 中。我们的一个要求是能够获得给定用户的所有密钥。例如,假设我们有 <id>:<timestamp>
这样的键。现在,在某个时间点,我需要获取给定 id
的所有键,我需要在 aerospike 命名空间(已编入索引)中对所有键进行前缀搜索,以获取所有键的值<id>:<timestamp>
键。想知道这是否可行,如果可行,如何实现。
您不能直接查询键前缀。服务器仅存储密钥摘要,因此密钥值(在您的情况下为 <id>:<timestamp>
)不会被编入索引。
对此建模的方法是将密钥的 <id>
部分添加为单独的记录箱。然后你可以索引那个 bin 和 运行 一个关于它的查询。
这是一个简单的示例 - 它使用的是 Aerospike Node.js 客户端,但无论您喜欢哪种客户端,概念都是相同的:
const Aerospike = require('aerospike')
const ns = 'test'
const set = 'demo'
// connect to cluster and create index on 'id' bin
var client = Aerospike.client()
client.connect((err) => {
assertOk(err, 'connecting to cluster')
createIndex('id', 'id_idx', Aerospike.indexDataType.STRING, () => {
// create a new sample record
var userId = 'user1'
var ts = new Date().getTime()
var key = new Aerospike.Key(ns, set, `${userId}:${ts}`)
var record = { id: userId, value: Math.random() }
client.put(key, record, (err) => {
assertOk(err, 'write record')
// query for records with matching 'id'
var query = client.query(ns, set)
query.where(Aerospike.filter.equal('id', userId))
var stream = query.foreach()
stream.on('error', (error) => assertOk(error, 'executing query'))
stream.on('end', () => client.close())
stream.on('data', (record, meta, key) => {
console.log(record)
})
})
})
})
function assertOk (err, message) {
if (err) {
console.error('ERROR: %s - %s', message, err)
process.quit()
}
}
function createIndex (bin, name, datatype, callback) {
var index = {
ns: ns,
set: set,
bin: bin,
index: name,
datatype: datatype
}
client.createIndex(index, (err, job) => {
assertOk(err, 'creating index')
job.waitUntilDone(100, (err) => {
assertOk(err, 'creating index')
callback()
})
})
}
希望对您有所帮助!
所以我希望将我们现有的 redis 数据建模到 aerospike 中。我们的一个要求是能够获得给定用户的所有密钥。例如,假设我们有 <id>:<timestamp>
这样的键。现在,在某个时间点,我需要获取给定 id
的所有键,我需要在 aerospike 命名空间(已编入索引)中对所有键进行前缀搜索,以获取所有键的值<id>:<timestamp>
键。想知道这是否可行,如果可行,如何实现。
您不能直接查询键前缀。服务器仅存储密钥摘要,因此密钥值(在您的情况下为 <id>:<timestamp>
)不会被编入索引。
对此建模的方法是将密钥的 <id>
部分添加为单独的记录箱。然后你可以索引那个 bin 和 运行 一个关于它的查询。
这是一个简单的示例 - 它使用的是 Aerospike Node.js 客户端,但无论您喜欢哪种客户端,概念都是相同的:
const Aerospike = require('aerospike')
const ns = 'test'
const set = 'demo'
// connect to cluster and create index on 'id' bin
var client = Aerospike.client()
client.connect((err) => {
assertOk(err, 'connecting to cluster')
createIndex('id', 'id_idx', Aerospike.indexDataType.STRING, () => {
// create a new sample record
var userId = 'user1'
var ts = new Date().getTime()
var key = new Aerospike.Key(ns, set, `${userId}:${ts}`)
var record = { id: userId, value: Math.random() }
client.put(key, record, (err) => {
assertOk(err, 'write record')
// query for records with matching 'id'
var query = client.query(ns, set)
query.where(Aerospike.filter.equal('id', userId))
var stream = query.foreach()
stream.on('error', (error) => assertOk(error, 'executing query'))
stream.on('end', () => client.close())
stream.on('data', (record, meta, key) => {
console.log(record)
})
})
})
})
function assertOk (err, message) {
if (err) {
console.error('ERROR: %s - %s', message, err)
process.quit()
}
}
function createIndex (bin, name, datatype, callback) {
var index = {
ns: ns,
set: set,
bin: bin,
index: name,
datatype: datatype
}
client.createIndex(index, (err, job) => {
assertOk(err, 'creating index')
job.waitUntilDone(100, (err) => {
assertOk(err, 'creating index')
callback()
})
})
}
希望对您有所帮助!