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;