Aerospike 最佳实践 (Java Client Best Practices)

当使用Java API的塞式客户端遵循这些最佳实践。

       同步的应用程序使用AerospikeClient ,异步的应用程序使用AsyncClient 

同步操作,设置clientpolicy.maxthreads将生成最大的数量的客户端线程。maxthreads数量是连接各节点的连接池(默认值= 300)。如果设置连接池大小太低,则为每个数据库调用创建套接字,这是慢的。如果设置连接池太高,则保留太多空闲连接

异步操作,设置asyncclientpolicy.asyncmaxcommands的并发命令处理由客户端在任何时间点的最大数目。

订阅客户端日志记录设备接收重要的群集状态消息:
 public class MyConsole implements Log.Callback {
      public MyConsole() {
          Log.setLevel(Log.Level.INFO);
          Log.setCallback(this);
      }      @Override
      public void log(Log.Level level, String message) {          // Write log messages to the appropriate place.
      }
  }

        每个aerospikeclient / asyncclient实例生成一个线程定期维护使信息请求的所有服务器节点分区映射。多个客户端实例在服务器上创建额外的负载。在应用程序中只使用一个客户实例,并在多个线程中共享实例。aerospikeclient和asyncclient是线程安全的。

        默认情况下,用户定义的key不存储在服务器上。它被转换为用于识别记录的哈希摘要。如果用户定义的key必须保存在服务器,使用下列方法之一:

             Set WritePolicy.sendKey to true — 该key被发送到服务器上并且存储,用于存储在多个记录扫描和查询中的写入。

             明确地存储和检索一个bin中的用户定义键。

       不要使用Value或者bin结构在一个对象中,这些构造函数比硬编码的构造函数慢,因为它的对象必须查询(using instanceof其真正的类型,还要使用Java默认的序列化,这是最慢的java序列化的实现,应该使用byte[]结构具有更好的序列效果。
      使用AerospikeClient.operate()一次在相同的record批量执行多个operations  (add/get) 。
      在所有 record bins 创建或更新的情况下,在一个transaction中启用替换模式以提高性能。在更新前,服务器不需要读取旧记录。在更新bins的sub set子集的时候不能使用替换模式
WritePolicy policy = new WritePolicy();
  policy.recordExistsAction = RecordExistsAction.REPLACE;
  client.put(policy, key, bins);
    每个数据库命令接受一个policy 作为第一个参数。如果policy 是相同的一组命令,再利用,而不是实例为每个命令他们的policy :
   Set ClientPolicy defaults and pass in a null policy on each command
ClientPolicy policy = new ClientPolicy();
policy.readPolicyDefault.timeout = 50;    
policy.readPolicyDefault.maxRetries = 1;
policy.readPolicyDefault.sleepBetweenRetries = 10;
policy.writePolicyDefault.timeout = 200;    
policy.writePolicyDefault.maxRetries = 1;
policy.writePolicyDefault.sleepBetweenRetries = 50;

AerospikeClient client = new AerospikeClient(policy, "hostname", 3000);
client.put(null, new Key("test", "set", 1), new Bin("bin", 5));
Instantiate your own policies once and pass them to each database command:
public MyClass {  private AerospikeClient client;  private WritePolicy writePolicy;  public MyClass(AerospikeClient client) {      
      this.client = client;
      writePolicy = new WritePolicy();
      writePolicy.timeout = 200;    
      writePolicy.maxRetries = 1;
      writePolicy.sleepBetweenRetries = 50;
  }  public void put(Key key, Bin... bins) {
      client.put(writePolicy, key, bins);
  }
}

If a policy needs to change from the default (such as setting an expected generation), instantiated that policy on-the-fly:

  public void putIfGeneration(Key key, int generation, Bin... bins) {
      WritePolicy policy = new WritePolicy();
      policy.generationPolicy = GenerationPolicy.EXPECT_GEN_EQUAL;
      policy.generation = generation;
      client.put(policy, key, bins);
  }








转载于:https://my.oschina.net/88sys/blog/533410

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值