【问题标题】:How do I get all the keys from a namespace?如何从命名空间中获取所有密钥?
【发布时间】:2015-11-18 13:03:40
【问题描述】:

如何从 aerospike 命名空间获取所有键,就像我可以使用 map.keyset 从映射中获取键一样。我浏览了这个链接Aerospike: how do I get record key?。我做了答案中所说的。我用writePolicy.sendKey = true 编写了代码,但是当我在scanCallback 函数中显示密钥时,我仍然得到NULL

这是我写记录的代码(任何帮助将不胜感激)

def writeToAerospike(): Boolean = {

val host:Host = new Host("xx.xxx.xxx.xx", 3000)
val client = new AerospikeClient(new ClientPolicy,host)

val policy = new WritePolicy();
policy.sendKey = true;
policy.timeout = 50000;

if(client.isConnected()){
   println("connection to aerospike client sucessful")
   client.put(policy,new Key("test", "testSet", "1"),new Bin("name", "john"))

   //verify if the record is entered correctly
   println(client.get(policy,new Key("test", "testing", "1")).getValue("name"))

   client.close()
   return true
}
return false 
}

我正在使用此示例中的代码来扫描记录:http://www.aerospike.com/docs/client/java/usage/scan/scan.html

class ScanParallelTest extends ScanCallback {

  private var recordCount: Int = _

  def runTest() {
    val client = new AerospikeClient("xxx.xx.xxx.xx", 3000)
    try {
      val policy = new ScanPolicy()
      policy.concurrentNodes = true
      policy.priority = Priority.LOW
      policy.includeBinData = true
      client.scanAll(policy, "test", "testSet", this)
      println("Records " + recordCount)
    } finally {
      client.close()
   }
 }

 def scanCallback(key: Key, record: Record) {
   recordCount += 1

   println("Records " + recordCount )
   println ("key=" + " "+key.userKey.toString() +" and "+" record: "+" "+ record.bins)
  }
}

这是我得到的错误:

com.aerospike.client.AerospikeException: java.lang.NullPointerException
    at com.aerospike.client.command.ScanExecutor.scanParallel(ScanExecutor.java:66)
    at com.aerospike.client.AerospikeClient.scanAll(AerospikeClient.java:551)
    at aerospike.asd.ScanParallelTest.runTest(ScanParallelTest.scala:23)
    at aerospike.asd.test$.main(test.scala:10)
    at aerospike.asd.test.main(test.scala)

Caused by: java.lang.NullPointerException
    at aerospike.asd.ScanParallelTest.scanCallback(ScanParallelTest.scala:35)
    at com.aerospike.client.command.ScanCommand.parseRecordResults(ScanCommand.java:122)
    at com.aerospike.client.command.MultiCommand.parseResult(MultiCommand.java:58)
    at com.aerospike.client.command.SyncCommand.execute(SyncCommand.java:56)
    at com.aerospike.client.command.ScanExecutor$ScanThread.run(ScanExecutor.java:134)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 您能否通过备份您的数据来交叉检查该密钥是否确实存在于服务器上。您的备份文件应该有密钥。只是试图隔离罪魁祸首。写或扫描。
  • 是的,将密钥发送到服务器但没有返回给我。

标签: get namespaces key record aerospike


【解决方案1】:

我尝试将client.readPolicyDefault.sendKey = true;client.scanPolicyDefault.sendKey = true;client.writePolicyDefault.sendKey = true; 一起使用,代码开始返回原始键而不是NULL。

这是helipilot50的工作代码链接:https://github.com/helipilot50/store-primary-key

这对我来说真的很有帮助。谢谢!

【讨论】:

    【解决方案2】:

    补充法赫德的答案:

    请记住,存储密钥(而不仅仅是摘要)会占用空间。如果您的 key 是一个 100 字符的字符串,而您的记录是两个 8 字节的整数,则 key 存储将使用比这两个值更多的空间。

    将这些知识用于善而不是恶:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-31
      • 2011-06-21
      • 1970-01-01
      • 2011-08-12
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多