Aerospike C客户端手册———最佳实践—使用策略



使用策略

Aerospike客户端使用一种称为策略的机制来定义数据库操作的行为。

策略值指示一个操作的行为。每个操作依赖于一系列策略值,统称为操作策略。每个操作接受一个策略对象做为第三个参数。

例如:aerospike_key_get()要求一个as_policy_read对象做为第三个参数。

as_status aerospike_key_get( aerospike *as, as_error *err, const as_policy_read *policy, const as_key *key, as_record **rec );

策略取值

策略是被一个操作使用的值。策略也可以有一个未定义值。例如:超时策略取值0被看作是未定义。同样,数据键策略取值AS_POLICY_KEY_UNDEFINED为未定义。

当一个值未被定义,会触发一个回退机制来找出一个默认策略值。

策略回退机制

当一个操作的策略值未定义,或者操作策略值是空值(NULL),那此操作的将使用默认操作策略。默认操作策略被定义成aerospike客户端实例的一部分,指示客户端实例的默认操作行为。若客户端实例的默认操作策略包含一未定义值,那默认策略值将被使用,默认策略值同样被定义成aerospike客户端的一部分。

例如:as_policy_read是一个操作策略,被应用到读操作。由两个策略值组成:超时和键。超时策略指示操作等待多长时间后超时。键策略(as_policy_key)指标操作键如何使用键。取值0的超时时间被认为是未定义值。键策略同样有一个未定义值:AS_POLICY_KEY_UNDEFINED。

正如我们在上面看到的,aerospike_key_get()操作接受一个as_policy_read策略。

在下面的代码行,设置这个操作策略为空。意味着这个策略取值回退到默认操作策略。

aerospike_key_get(&as, &err, NULL, &key, &rec);

假设读取的默认操作策略(as_policy_read)被定义为:

aerospike.config.policies.read.timeout = 0; aerospike.config.policies.read.key = AS_POLICY_KEY_DIGEST;

说明键策略现在被定义为AS_POLICY_KEY_DIGEST,超时策略依然为未定义。

这将导致超时策略回退到默认策略值,被定义为:

aerospike.config.policies.timeout = 1000;

因此上述aerospike_key_get()操作使用的实际策略是:

policy.timeout = 1000; policy.key = AS_POLICY_DIGEST;

定义默认策略

就像上面所看到的,默认策略做为客户端实例配置的一部分来定义。允许在初始化aerospike客户端实例之前设置默认策略。

在修改配置之前,应用把它初始化成默认值。

as_config config; as_config_init(&config)

一旦被初始化,就能修改策略值。

若想要改变所有操作的默认超时为2秒,那么将这么做:

config.policies.timeout = 2000;

若只想写操作的超时是1秒,所有其它操作的超时是2秒超时,那么如此干:

config.policies.write.timeout = 1000;

这意味着aerospike_key_get()默认2秒超时,aerospike_key_put()默认1秒超时,若它们未指定超时的替代值。

若想在操作级指定策略,只需要简单地初始化策略并以想要的值覆盖默认值。每个操作策略都有一个初始化函数。

as_policy_read policy; as_policy_read_init(&policy);

可如此设置策略的值:

policy.timeout = 5000;

传递设置好的策略到操作函数:

aerospike_key_get(&as, &err, &policy, &key, &rec);

这将使此操作的策略如下所示:

policy.timeout = 5000; policy.key = AS_POLICY_DIGEST;

由于没有特意为此操作定义键策略,因此它将使用在前面定义的键策略默认值。

aerospike.config.policies.read.key = AS_POLICY_KEY_DIGEST;

来源: <http://www.aerospike.com/docs/client/c/best_practices/policies.html>
 

你可能感兴趣的:(分布式,NoSQL,Aerospike,Shard-nothing,内存数据库)