2016-05-13 49 views
3

所以我正在尋找將我們現有的redis數據建模成aerospike。我們的一個要求是能夠獲得給定用戶的所有密鑰。例如,假設我們有鑰匙,如<id>:<timestamp>。現在,在某個時間點,我需要獲得給定id的所有密鑰,我需要在aerospike命名空間中的所有密鑰(通過索引)進行前綴搜索,以獲取所有<id>:<timestamp>密鑰的值。想知道這是否可能,如果是的話,如何。謝謝。是否有可能搜索Aerospike中以某個前綴開頭的所有密鑰?

回答

5

您無法直接對關鍵字進行查詢。服務器僅存儲密鑰摘要,因此密鑰值(您的案例中的<id>:<timestamp>)未獲得索引。

建模的方法是將您的密鑰的<id>部分作爲單獨的記錄箱添加。然後,您可以對該bin進行索引並在其上運行查詢。

下面是一個簡單的例子 - 它使用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() 
    }) 
    }) 
} 

希望這有助於!

相關問題