Aerospike C客户端touch操作指定TTL未生效,仅重置为默认值如何解决?
问题原因及修复方案
1. 核心代码错误
当前代码存在变量误用问题:函数内将目标key初始化到了局部变量record_key中,但调用操作接口时传入的是全局变量g_key,实际操作的不是目标记录,自然TTL设置不会生效到对应记录上。
2. API使用优化
部分旧版本Aerospike C客户端中,as_operations全局设置的TTL对touch操作优先级不足,建议直接使用带TTL参数的touch操作接口显式指定,避免优先级问题。
3. TTL参数校验
注意传入的TTL值需要符合命名空间配置规则:
- 传
0代表使用命名空间默认TTL,就是你当前遇到的重置为默认值的情况 - 传
-1(或0xFFFFFFFF)代表记录永不过期 - 自定义TTL不能超过命名空间配置的
max-ttl,超过的话服务端会自动截断为max-ttl
修正后代码
as_status update_record_ttl(int ttl, const char *key) { as_operations ops; as_operations_inita(&ops, 1); // 改用带TTL参数的touch接口,显式指定当前操作的TTL as_operations_add_touch_with_ttl(&ops, ttl); as_error err; as_key record_key; as_key_init_str(&record_key, g_namespace, g_set, key); // 修正key参数,传入正确初始化的局部record_key if (aerospike_key_operate(&g_as, &err, NULL, &record_key, &ops, NULL) != AEROSPIKE_OK) { fprintf(stderr, "TTL update failed!! rc=%d\n", err.code); } as_operations_destroy(&ops); return err.code; }
内容的提问来源于stack exchange,提问作者abhishek jadhav patil
相关产品推荐
相关产品推荐

